İçindekiler:
Arduino'nu aldın ve Servo'nu aldın …
İşte yazdığım, o servoyu kalbinizin içeriğine uygulamanıza izin verecek küçük bir program. Destekleyici kodlardan bazılarını da faydalı bulabilirsiniz!
Gerçekten başka bir Parça Listesi yok, bu yüzden hemen Kurulum'a, sonra da Kod'a geçeceğiz.
Bu örnekte, Servo'nun Sinyal (Sarı) kablosunu Arduino'nun Pin 9'una bağladım.
+ 5VDC'yi seçtim ve ICSP Konektörünü toprakladım: Pin 2: 5V ve Pin 6: GND.
Test amacıyla, bu Duemilinove'yu bilgisayarımın USB Bağlantı Noktasına bağlı tuttum. Cihazınıza güç sağlamak için bir Wall-Wart veya Pil Paketi (taşınabilirlik için) kullanabilirsiniz.
Gereçler:
Adım 1: OPERATÖR EKRANI
Bu adıma eklenen fotoğraf, Operatör Ekranını, programın Arduino Geliştirme Sisteminde veya HyperTerminal'de Monitör Ekranına yerleştireceğini gösterir. Yapmanız gereken tek şey Terminal Hızını Kod ile eşleştirmek; Bu örnekte 115200 BAUD.
Ekran açıldığında, başlamak için herhangi bir tuşa basın. Geliştirme Sisteminde, Çıktı Alanını tıklatmanız, çıktınızı yazmanız ve GÖNDER düğmesini tıklatmanız gerektiğini unutmayın. HyperTerminal'da, yazmanız yeterlidir - çoğu durumda program tek anahtar girişlerine yanıt verir.
's' Hızı Düşürür ve 'S' Süpürme İşleminin Yapıldığı Hızı Artırır.
'i' ve 'I' Taşıma Artışını Kontrol Edin - Her adımda Servo'nun kaç uSec'i taşınır.
'd' ve 'D' Her Süpürme arasındaki Gecikmeyi denetleyin.
'n' ve 'N' Minimum Temizleme Konumunu ayarlayın.
'm' ve 'M' Maksimum Temizleme Konumunu ayarlayın.
'?' Min, Maks, Hız, Artış ve Gecikme Mevcut Değerlerini görüntüler.
'C' Servo Merkez Konumunu geçerken Duraklatılıp duraklatılmayacağını ayarlar.
'l', 'L', 'r' ve 'R' Manuel Modu etkinleştirin. Otomatik Süpürme Askıya Alındı.
'l' ve 'r', her basışta Servo Sol ve Sağ 1 uSec'i hareket ettirir.
'L' ve 'R' her basışta Servo Sola ve Sağa 10 uSs hareket ettirir.
'X' Tüm Değişkenleri Varsayılan Değerlerine Sıfırlar.
'Z', Programın bir sonraki başlatılmasında hatırlanacak geçerli değerleri kaydeder.
'P' Bir Konumun Manuel Olarak Girilmesine İzin Verir. Otomatik Süpürme Askıya Alındı.
Adım 2:
İşte tüm program - İstediğiniz gibi kullanmanız için ücretsiz …
Bu kod kapsamlı olarak test edilmiştir ve herhangi bir hatanın farkında değilim!
/*************************************************************/
/ *** S W E E P E U S E - Servo Sürücü Programı V.110308 *** /
/ *** Mark Theobald - www.DisabledAdventurers.com *** /
/*************************************************************/
#Dahil etmek
#Dahil etmek
Servo Servo1; // Bir Servo Nesnesi Oluştur
int CPOS = 1500; // Mevcut Konum (uSec cinsinden)
int HIZ = 2500; // Servo Hızı (1-100 * 300)
int GECİKME = 1000; // Süpürmeler Arasında Gecikme (0-5000 mSec)
int INCR = 1; // Servo Artışı (1-50 usSs)
int CSTOP = 1; // Merkezde Dur (Evet veya Hayır)
int AMIN = 675; // Mutlak Min (Minimum = 675)
int AMAX = 2325; // Mutlak Maks (Maksimum = 2325)
int MIN, MAX; // Mevcut MIN ve MAX Değerleri
int SPCP; // Sweep Merkez Konumunu Geçti
int Ct, LoopCount; // Bazı Küresel Değişkenler
char Dize 80; // Bir String Tamponu
int Sayı; // Bir Sayı Değişkeni
int ABYTE, EPAD; // EEPROM'u okumak ve yazmak için
boşluk StoreDefaults (boşluk);
void RetrieveDefaults (geçersiz);
boşluk CheckSerial (boşluk);
boşluk SweepTo (int Konum);
geçersiz ManualRotation (geçersiz);
geçersiz ManualEntry (geçersiz);
void GetANumber (geçersiz);
/*************************************************************/
geçersiz kurulum () {
Servo1.atak (9, AMIN, AMAX); // SERVO'yu Pin 9'a takın
Servo1.writeMicroseconds (1500); // Servoyu Merkez Konumuna getirin
Seri.begin (115200); // Bunu HyperTerminal'de eşleştir!
Seri.print (" n r"); // Operatör Menüsünü Göster
Seri.print ("---------------------------------------------- n r ");
Serial.print ("S E ğ U E R İ R - Servo Sürücü Programı n r");
Seri.print ("---------------------------------------------- n r ");
Serial.print ("s / S = Hız, i / I = Hareket Artışı, d / D = Gecikme n r");
Seri baskı ("n / N = Min, m / M = Maks,
Seri.print ("C = Merkez Durdurma, L / R = Manuel Mod, X = Sıfırla n r");
Serial.print ("Z = Mağaza Varsayılanları, P = Konumu Manuel Olarak Girin n r");
Seri baskısı ("------------------------------------------------");
MIN = AMIN; // MIN ve MAX Değerlerini ABSOLUTE MIN & MAX Değerlerine Sıfırla
MAX = AMAX;
RetrieveDefaults (); // EEPROM'da kayıtlı olabilecek değerleri okuyun
while (! Serial.available ()); // Herhangi Bir Anahtarın Başlamasını Bekleyin
Serial.read (); }
/*************************************************************/
boşluk döngüsü () {
sprintf (Dize, " n% 06d:", ++ LoopCount); // Döngüleri takip et
Seri.print (Dize);
SweepTo (MAX);
Seri baskı ("CW"); // Son hareketi belirt
CheckSerial ();
gecikme (GECİKME);
if (CSTOP && SPCP) {// Merkez & de durmak istiyoruz
SweepTo (1500); // Sweep ortadaki pozisyondan geçer
Seri baskı ("Merkez");
CheckSerial ();
gecikme (GECİKME); }
SweepTo (MIN);
Seri baskı ("CCW");
CheckSerial ();
gecikme (GECİKME);
eğer (CSTOP ve SPCP) {
SweepTo (1500);
Seri baskı ("Merkez");
CheckSerial ();
gecikme (GECİKME); }}
/*************************************************************/
void RetrieveDefaults () ABYTE;
Seri.print (" n rMIN:");
Seri baskısı (MIN, DEC);
eğer (MIN <AMIN
/*************************************************************/
void StoreDefaults () {
EPAD = 0;
EEPROM.write (EPAD ++, char ((MIN >> 8) ve 0x00FF));
EEPROM.write (EPAD ++, char (MIN & 0x00FF));
EEPROM.write (EPAD ++, char ((MAX >> 8) & 0x00FF));
EEPROM.write (EPAD ++, char (MAX & 0x00FF));
EEPROM.write (EPAD ++, char ((HIZ >> 8) & 0x00FF));
EEPROM.write (EPAD ++, char (SPEED & 0x00FF));
EEPROM.write (EPAD ++, char ((GECİKME >> 8) & 0x00FF));
EEPROM.write (EPAD ++, char (DELAY & 0x00FF));
EEPROM.write (EPAD ++, char ((INCR >> 8) ve 0x00FF));
EEPROM.write (EPAD, char (INCR ve 0x00FF)); }
/*************************************************************/
void CheckSerial () {
char Key;
while (Serial.available ()) {
if ((Key = Serial.read ()) == 's' || Anahtar == 'S' || Anahtar == '?') {
eğer (Key == 's' && HIZ> 300) HIZ - = 300;
eğer (Key == 'S' && HIZ <30000) HIZ + = 300;
if (Key == '?') Seri.print (" n r");
sprintf (Dize, "Hız:% d", HIZ / 300); // 0 - 100
Seri.print (Dize); }
if (Key == 'i' || Key == 'I' || Key == '?') {
if (Key == 'i' && INCR> 1) INCR--;
eğer (Key == 'I' && INCR <50) INCR ++;
sprintf (String, "Incr:% d", INCR); // 0 - 50
Seri.print (Dize); }
if (Key == 'd' || Key == 'D' || Key == '?') {
eğer (Anahtar == 'd' && GECİKME> 49) GECİKME - = 50;
eğer (Anahtar == 'D' && GECİKME <5000) GECİKME + = 50;
sprintf (Dize, "Gecikme:% d", GECİKME / 50); // 0 - 100
Seri.print (Dize); }
if (Key == 'n' || Key == 'N' || Key == '?') {
if (Key == 'n') if ((MIN - = 20) <AMIN) MIN = AMIN;
if (Key == 'N') if ((MIN + = 20)> MAX - 1) MIN = MAX - 1;
sprintf (String, "Min:% d", MIN);
Seri.print (Dize);
SPCP = MIN <1500 ve & MAX> 1500; } // Sweep Merkez Konumunu Geçti
if (Key == 'm' || Key == 'M' || Key == '?') {
eğer (Key == 'm') eğer ((MAX - = 20) <MIN + 1) MAX = MIN + 1;
if (Key == 'M') if ((MAX + = 20)> AMAX) MAX = AMAX;
sprintf (String, "Max:% d", MAX);
Seri.print (Dize);
SPCP = MIN <1500 ve & MAX> 1500; }
if (Key == 'c' || Key == 'C') {
CSTOP =! CSTOP;
sprintf (Dize, " n rStop @ Center =% s n r", CSTOP? "Evet": "Hayır");
Seri.print (Dize); }
if (Key == '') {
Seri.print ("Duraklat");
while (! Serial.available ()); // Duraklatıldı - Herhangi Bir Anahtar Bekleyin
Serial.read ();
Serial.print ("Çalıştır"); }
if (Key == 'x' || Key == 'X') {// Tüm değişkenleri sıfırla
HIZ = 7500;
GECİKME = 1000;
INCR = CSTOP = SPCP = 1;
MIN = AMIN;
MAX = AMAX; }
if (Key == 'r' || Key == 'R' || Key == 'l' || Key == 'L')
ManualRotation ();
if (Key == 'z' || Key == 'Z') StoreDefaults ();
if (Key == 'p' || Key == 'P') {
while (Serial.available ()) Serial.read (); // Tamponu Temizle
Manuel giriş(); }}}
/*************************************************************/
void ManualEntry () {
Seri.print (" n n rMANUAL GİRİŞ MODU");
sprintf (Dize, "--- MIN:% d, MAX:% d", MIN, MAX);
Seri.print (Dize);
Serial.print (" n rNümerik Konum
(1) {
GetANumber ();
eğer (Sayı <0) dönüş;
sprintf (String, ":% d", Sayı);
Seri.print (Dize);
if (Number> = MIN && Sayı <= MAX) {
CPOS = Sayı;
Servo1.writeMicroseconds (CPOS);
Seri.print (" n r"); }
Başka {
Serial.print (" N r" aralığında değil);
sprintf (Dize, "% d -% d
Seri.print (Dize); }}}
/*************************************************************/
void GetANumber () {
char Anahtar = 0;
Sayı = 0;
while (Key! = '') {
if (Serial.available ()) {
if ((Key = Serial.read ()) == 13) dönüş; // CR
if (Key> 47 && Key <58) {// ASCII '0' 9 '
eğer (Sayı) Sayı * = 10; // Öncü Sıfırlar Yok!
Sayı + = (Anahtar - 48); }}}
Sayı = -1;
dönüş; }
/*************************************************************/
void ManualRotation () {
char Key;
Serial.print (" n n rMANUAL ROTATION MODE");
Seri.print (" n rl / L = Sol, r / R = Sağ,
(1) {
if (Serial.available ()) {
if ((Key = Serial.peek ()) == 'p' || Key == 'P') dönüş;
if ((Key = Serial.read ()) == '') {
Seri.print (" n r");
dönüş; }
if (Key == 'r' || Key == 'R' || Key == 'l' || Key == 'L') {
eğer (Key == 'r' && CPOS <AMAX) CPOS ++;
if (Key == 'R') {
eğer (CPOS <AMAX - 9) CPOS + = 10;
başka CPOS = AMAX; }
eğer (Key == 'l' && CPOS> AMIN) CPOS-;
eğer (Anahtar == 'L') {
eğer (CPOS> AMIN + 9) CPOS - = 10;
başka CPOS = AMIN; }
Servo1.writeMicroseconds (CPOS);
sprintf (String, ":% d", CPOS);
Seri.print (Dize); }}}}
/*************************************************************/
void SweepTo (int Konumu) {
eğer (CPOS <Pozisyonu) iken ((CPOS + = INCR) <= Konum) {
Servo1.writeMicroseconds (CPOS);
(Ct = SPEED; Ct <30000; Ct ++); }
başka bir süre ((CPOS - = INCR)> = Konum) {
Servo1.writeMicroseconds (CPOS);
(Ct = SPEED; Ct <30000; Ct ++); }
if (CPOS! = Konum) Servo1.writeMicroseconds (CPOS = Konum); }
/*************************************************************/
/ ******** END PROGRAMI ******** /
/*************************************************************/