Arduino Kontrollü Servo Egzersizcisi

Arduino Kontrollü Servo Egzersizcisi

İçindekiler:

Anonim

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.

Hareketi duraklatır.

'?' 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, = Duraklat,? = Ekran n r ");

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, = Çık n r ");

(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 veya Çıkmak için … n r ", MIN, MAX);

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ğ, = Çık n r ");

(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 ******** /

/*************************************************************/