Kopterit.net
Tekniikka => Protopaja => Aiheen aloitti: 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.
/*
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
}
-
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.
-
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.
-
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.
-
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
-
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"
#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
-
Eikös sen taajuuden pysty muuttamaan kirjastoa puukottamalla.
Siis sieltä SoftwareServo::refresh "lastRefresh + 20" vaikka 10:iin, niin on 100 Hz.
-
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.
-
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.
-
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).
-
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)
-
No niinpä oli. Kiitosta. En ehtinyt tarkistaa pakettia viä mutta kuvassa ainakin näkyy PWM nii eiköhän tolla pärjää.
-
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..
-
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ä?