Kopterit.net

Tekniikka => Protopaja => Aiheen aloitti: Juho_88 - 17 Lokakuu, 2010, 18:34:31

Otsikko: Servon ohjaus arduinolla
Kirjoitti: Juho_88 - 17 Lokakuu, 2010, 18:34:31
Opettelen tässä ohjelmoimaan arduinoa ja tuli tehtyä tämmöinen ohjelma jolla voi testailla servoja.
Toivottavasti tästä on hyötyä muillekin.

Koodia: [Valitse]
/*
Servon ohjaus Arduino Duemilanovella ja Arduinon serial monitorilla.
Testattu HEXTRONIK HXT900 servolla
Vaatii ulkoisen virtalähteen Arduinolle (USB:stä loppuu teho) esim. 7.4V LiPo
kytkentä:
GND-->servon -(ruskea)
5V-->servon +(punainen)
pinni9-->servon ohjaus(oranssi)
Ohjaus tehdään syöttämällä haluttu ohjauspulssin pituus mikrosekunteina serial monitoriin.
*/
  int sarja = 1500;                            //alustetaan pulssin pituus oletettuun keskikohtaan
 
void setup() {
  Serial.begin(9600);                          //avataan sarjaporttiyhteys
  pinMode(9,OUTPUT);                           //pinni 9 käyttöön
}

void loop() {
  if (Serial.available() > 0) {                //onko sarjaportista tulossa tietoa
    sarja = 0;                                 //alustetaan muuttuja nollaksi
    while(Serial.available() > 0)              //luetaan sarjaportista tuleva tieto
    {
      sarja *= 10;                             //muuttaa näppäimistöltä
      sarja += (Serial.read() - '0');          //tulleen syötteen desimaaliluvuksi (kopiotu netistä en tiedä kuinka toimii)
      delay(2);                                //odotetaan että kaikki tieto on vastaanotettu.
    }
      if (sarja < 550)                         //pulssin pituuden alarajan asetus. Aseta niin ettei servo junnaa laitaa vasten
        sarja = 550; 
      if (sarja > 2500)                        //pulssin pituuden ylärajan asetus
        sarja = 2500;
       
   Serial.print(sarja,DEC);                    //tulosta sarjaporttiin mitä syötettiin
  }
  digitalWrite(9, HIGH);                       //ohjauspulssi päälle
  delayMicroseconds(sarja);                    //pidä pulssi päällä asetetun ajan verran
  digitalWrite(9, LOW);                        //ohjauspulssi pois
  //delayMicroseconds(5000);                   //Viive ennen seuraavaa pulssia. Mitä pienempi sitä tehokkaammin ja tarkemmin servo toimii
  delay(20);                                   //oletusarvo 20ms--> n.50Hz HXT900 toimii nätisti myös 5000us(n.200Hz)pulssilla
}
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Bonzer - 17 Lokakuu, 2010, 18:40:32
Hyvältä näyttää ainakin omaan silmään. Mun mielestä oli helpompi tehdä picaxella, koska siellä on valmis servo toiminto eli pystyy yhdellä koodilla päättämään servon asennon. Siihen perään joku potikka jolla pystyy muutamaan servon asentoa. Ei sillä, että olis huono vaihtoehto toikaan, omalla kohdalla kun tuo koodi näyttää sekasotkulta, kun on kirjottanu picin koodia.
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Jussi. - 17 Lokakuu, 2010, 18:55:06
Hienoa, 
tuo on opettavainen tapa tehdä,  toki siihen löytyy valmis kirjastokin:
http://quarkstream.wordpress.com/2010/03/16/arduino-9-servos/ (http://quarkstream.wordpress.com/2010/03/16/arduino-9-servos/)

Mun arduino on maannut hyllyllö odottamassa "aikaa".

Mulla on ollut mielessä tehdä oikeen kunnon servotesteri, joka mittaisi servon nopeuttaa, tarkkuutta ja virranottoa  erilaisissa kuormitustilanteissa.
Pikkusen tällä hetkellä jarruttaa että ei tule hyvää ideaa mekaanisesta laitteesta joka olisi helppo toteuttaa tai jo olemassa oleva jolla tuota rasitusta saisi aikaiseksi toistettavasti.
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Jerkku - 17 Lokakuu, 2010, 19:28:27
Lainaus
Pikkusen tällä hetkellä jarruttaa että ei tule hyvää ideaa mekaanisesta laitteesta joka olisi helppo toteuttaa tai jo olemassa oleva jolla tuota rasitusta saisi aikaiseksi toistettavasti.
Jos ymmärsin ajatuksesi oikein, niin toimisiko esim rc-auton iskari sopivan paksuisilla öljyillä ja ilman jousta.
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Juho_88 - 17 Lokakuu, 2010, 19:30:32
Tiesin kyllä servokirjastosta. Itse opin kuitenkin jonkin verran servonkin toiminnasta kun tein ohjelman ilman valmista kirjastoa. Arduinollehan löytyy servoista pari esimerkkiäkin:
potikkaohjaushttp://arduino.cc/en/Tutorial/Knob (http://arduino.cc/en/Tutorial/Knob)
edestakaisin pyyhkiminenhttp://arduino.cc/en/Tutorial/Sweep (http://arduino.cc/en/Tutorial/Sweep)

Pystyykös tuota servokirjastoa käyttäessä muuttamaan servolle menevän signaalin taajuutta(taukojakson pituus). Mikähän tuo taajuus mahtaa olla servokirjastoa käytettäessä? Veikkaisin 50Hz
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Jussi. - 17 Lokakuu, 2010, 19:50:37
Lainaus
Pystyykös tuota servokirjastoa käyttäessä muuttamaan servolle menevän signaalin taajuutta(taukojakson pituus). Mikähän tuo taajuus mahtaa olla servokirjastoa käytettäessä? Veikkaisin 50Hz
Eipä pysty,
Vakioksi asetettu 20000µs, eli juuri tuo 50Hz

Ote fileest' "Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2"
Lainaus
#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo 
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Mikka - 17 Lokakuu, 2010, 20:30:43
Eikös sen taajuuden pysty muuttamaan kirjastoa puukottamalla.

Siis sieltä SoftwareServo::refresh "lastRefresh + 20" vaikka 10:iin, niin on 100 Hz.

Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Juho_88 - 17 Lokakuu, 2010, 22:13:43
Sieltähän ne kaikki löytyykin  :) . Eipähän vaan oo tullu mieleenkään mennä ronkkiin noita kirjastoja. Kannattaa varmaan tallentaa muokatut kirjastot eri nimellä ettei myöhemmin tuu ongelmia, kun tarvii käyttää standardikirjastoa.
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: Jussi. - 17 Lokakuu, 2010, 22:35:52
Lainaus
Eipähän vaan oo tullu mieleenkään mennä ronkkiin noita kirjastoja. Kannattaa varmaan tallentaa muokatut kirjastot eri nimellä ettei myöhemmin tuu ongelmia, kun tarvii käyttää standardikirjastoa.
Juu, yllättävän pieniä noi kirjastot on. Todella opettavaista lukemista. Sieltähän voi sitten parhaimmillaan poimia vaan rusinat omaan koodiin niin säästyy vähän sitä vähäistä muistia.


Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: sniiki - 23 Toukokuu, 2011, 12:00:26
Arduinon sivuilta varmaan löytyisi tietoa mutta kysytään nyt mielipidemielessä että onko tämä lankku (tarkemmin siis esim. Arduino Uno) hyvä valinta ns. yleisräpellykseen, jossa tarkoitus on lähinnä käyttää lautaa I/O alustana ja varsinainen ohjaussovellus pyörii PC:llä? Olikos Arduinoon yleensäkään mitään valmista rajapintakirjastoa olemassa esim. VB.Net kielellä, vai pitääkö kääntyä atmel-sivustojen puoleen?

Törmäsin tähän lankkuun tehdessäni pientä tutkielmaa WSN nodeista ja tämän halpa hinta pisti houkuttelemaan. Ei maksa vaivaa alkaa itse piirilevyä rakenteleen jos valmiin paketin saa 20eurolla. (Oma atmel-kooderi ollu kasausta odottamas vuoden).
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: IsoHK - 23 Toukokuu, 2011, 23:14:54
Olikos Arduinoon yleensäkään mitään valmista rajapintakirjastoa olemassa esim. VB.Net kielellä, vai pitääkö kääntyä atmel-sivustojen puoleen?
Tuolta löytyy useammallekin kielelle, VB.Netille 3. viimeisenä...ei varsinainen kaikenkattava rajapintakirjasto mutta kyllä sillä I/O-pinnejä ohjailee:
http://www.arduino.cc/playground/Main/InterfacingWithSoftware (http://www.arduino.cc/playground/Main/InterfacingWithSoftware)

Tuoltakin löytyy jotain arduino/.Net liittyvää:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1290689533 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1290689533)
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: sniiki - 24 Toukokuu, 2011, 20:45:53
No niinpä oli. Kiitosta. En ehtinyt tarkistaa pakettia viä mutta kuvassa ainakin näkyy PWM nii eiköhän tolla pärjää.
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: 1m4s0_ - 03 Heinäkuu, 2011, 23:06:38
lainataanpa tätä, miten tuo homma tarkalleenottaen menee.. onko joku perehtynyt?

Olen käsittänyt että noparia ohjataan ihan samalla signaalilla kuin servojakin.
Servo testerillä saan pyörimään moottorin ihan oikein, samoin servo liikkuu laidasta laitaan ihan oikein.
arduinolla servo liikkuu ihan oikein laidasta laitaan mutta nopari ei kyllä resetoidu oikein,

"servo testeri" arduinon omalla servo kirjastolla spoilerin alla.
[spoiler]

#include <Servo.h>
 
Servo myservo;
  int val = 90;                           
 
void setup() {
  Serial.begin(9600);                       
  myservo.attach(24);                         
}

void loop() {
  if (Serial.available() > 0) {               
    val = 0;                             
    while(Serial.available() > 0)             
    {
      val *= 10;                             
      val += (Serial.read() - '0');         
      delay(2);                               
    }
      if (val < 1)                         
        val = 1; 
      if (val > 180)                       
        val = 180;
   Serial.print("Annettu aste-arvo:" );
   Serial.println(val,DEC);
   
   Serial.print("Servolle välitetty aste: ");
   Serial.println(val,DEC);
   Serial.print("Pulssinleveys: ");
   Serial.println(pulseIn(24, LOW
   ));   
  }
myservo.write(val);                                     
  delay(100);                                   
}[/spoiler]

Tuolla ohjelmalla saa ohjattua servoa asteluvulla haluttuun kohtaan ja sitten se näyttää pulssin leveyden myös.
asteella pulssin leveys on n.17470
180-astetta niin leveys on n.19300

Turnigyn servo testerillä samat lukemat
aste n.14400
180-astetta n.15400

Coronan 6ch syntikka PPM vastarilla
aste n.19900
180-astetta n. 20900

Eli kaikissa on noin 1000 väli, paitsi arduinon kirjastolla. Mitattu, ulostulo signaalin pinneistä..
Eli raa asti ylhäällä olo eli ohjaus pulssi olisi n.1000 mikrosekunttia.. arduinolla 2000.
Pulssit on selvitetty tällä softalla, löytyy taas spolerin alta
[spoiler]void setup()
{
Serial.begin(57600);
pinMode(22, INPUT);
}
void loop()
{
Serial.println(pulseIn(22, LOW));
}[/spoiler]

Tuolla vois hakea PPM signaalin vastarilta jos tarvitsee, löysin netin syövereistä tuon, tässä linkki
http://diydrones.com/profiles/blogs/705844:BlogPost:38393 (http://diydrones.com/profiles/blogs/705844:BlogPost:38393)

En ole näihin signaaleihin nyt perehtnyt sen kummin vielä. Kanavakohtaista dataahan nuo mitatut tietenkin on ei varsinaista PPM signaalia jota nyt en tarvitsekkaan.. mikrosekuntteja on mitatut arvot. nyt ohjelma aloittaa laskemisen siitä kun pinni menee alas(0) ja laskee kunnes se nousee taas ylös(1). Jos muuttaa niin että laskee nousevasta nousevaan niin arvot ovat "järkevämpiä" eli 300-2500 mikrosekunttia.
Eli LOW asetuksella mitataan alhaalla olevaa tasoa ja HIGH asetuksella ylhäällä olevia tasoja.. kuva selventämään: (lainattu edellämainitulta sivulta)
http://api.ning.com/files/WmjViE3faLYy73Ry7eTzn4XMryr8qlAMeb*edCbrzW1BVUPtR1iXBIGgsS93iG1x5roVRkAWHqg7V3FAhK*o8NYsajr5nW7G/RC_Receiver_Timing_Diagram1.jpg (http://api.ning.com/files/WmjViE3faLYy73Ry7eTzn4XMryr8qlAMeb*edCbrzW1BVUPtR1iXBIGgsS93iG1x5roVRkAWHqg7V3FAhK*o8NYsajr5nW7G/RC_Receiver_Timing_Diagram1.jpg)

Kaikki tämä sen takia että olisin halukas ohjelmoimaan noparia arduinolla, jos joku osaa hjelppiä tai tietää jo valmiin softan niin vinkkaa. Samalla ois kiva tietää miksei tuo noparin ohjaus onnistu samalla tavalla kun servokin pelaa.. ja miten servo toimii tuolla esim servo testerillä ja arduinolla vaikka pulssin leveys on kaksinkertainen. Voi olla että teen itsestäni hölmön mutta ei vaan nyt ymmärrä tätä?  ;D
Oma "pöytäkäytössä" oleva leikkikalu on Arduino MEGA 2560..
Otsikko: Vs: Servon ohjaus arduinolla
Kirjoitti: ChiKung - 04 Heinäkuu, 2011, 09:29:59
Lainaus
arduinolla servo liikkuu ihan oikein laidasta laitaan mutta nopari ei kyllä resetoidu oikein
Kaksi vaihtoehtoa mielestäni.
- Noparissa on suojaus, ettei lähde käyntiin jos virrat kytkettäessä ei ole signaali nollassa. Eli pitänee olla joku useamman sekunnin viive, jonka ajan tuo pitää signaalin nollassa. Servojen nolla taitaa olla se 1,5 ms, mutta noparille se -90 astetta (noin 1ms tai joissain jopa 0,7 ms)? Yleensä noparit ei starttaa, jos sattuu jäämään vähänkään trimmiä.
- Väärä taajuus. Servothan syö aika laajan taajuusalueen, mutta monet noparit eivät. Eli onko jakso tuo noin 20 ms?

Kokeile vaikka niin, että aluksi pitää muutamia sekunteja minimipulssilla. Onko muuten io:ssa ylösveto? Eli onko bootissa ylhäällä?