[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  Arabic  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Authors]
taraf�ndan Katja and Guido Socher

Yazar hakk�nda:

Katja LinuxFocus'un Alman edit�r�d�r. Tux, film, fotograf��l��� ve denizi sever. Ana sayfas�na buradan ula�abiliriz.

Guido uzun zamandan beri bir Linux hayran� ve o Linux'u d�r�st ve a��k insanlar taraf�ndan tasarland��� i�in seviyor. ��te bu ona a��k kodlu dememizin bir nedeni... Guido'nun sanaldoku sayfas�: linuxfocus.org/~guido


��erik:

 

Linux Denetimli Y�r�yen Robot Yap�m�

[Illustration]

�eviri : Mert DEVA,Tuncer B�RTAN, Do�ucan KANAL

�zet:

Bu makalede bir linux pc nin paralel port arabirimini kullanarak alt� bacakl� bir robotu yapaca��z ve y�netimini sa�layaca��z.



 

Giri�

Robotlar herzaman bizi heyecanland�rm��t�r.Bu makalede Stiquito adl� ufak b�ce�e benzeyen bir robot yapaca��z.Stiquito biraz �zel bir robottur,��nk� onun herhangi bir motoru olmamas�na ra�men ninitol telli ayaklar� sayesinde y�r�yebilir ve bunu bir b�cek gibi sessiz bir �ekilde yapabilir. Ama bu robotu yapt���m�zda g�rd�k ki,yeterli s�rt�nme olmay��� nedeniyle �ok yava� y�r�yebiliyordu.�ans eseri, elimizdeki robot kitab� di�er robot tasar�mlar�n�n a��klamalar�n� da i�eriyordu ve burada anlatt���m�z robot yap�m� hakk�nda bize ilham verdi.

 

Nitinol


Robotumuz motorsuz olmas�na ra�men nitinolle g��lendirilmi� tellerle olu�mas�ndan dolay� y�r�yebilmektedir.Nitino �ekil-haf�zal� ala��ma sahip devinimli bir tele sahiptir.Bu tel nikel ve titanyum ala��ml�d�r ve �s�t�ld���nda kaslar gibi kas�l�r.Elektrik ak�m� yolland���nda tel �s�n�r ve k�sal�r(yani uzamam�� �ekline geri d�ner).Bir kar�� g�� te (m�zikteli gibi) nitinol� eski haline getirmek i�in kullan�l�r.E�er nitinol� %3 ile %5 aras�nda gerersek kas teli �ok tutarl� ve g�venilir bir hal alacakt�r ve milyonlarca sinyali �al��t�rabilecektir.

 

Robotun Yap�m�

Robotu yapmak i�in gerekli olan par�alar:



[pliers]
�ekil 2: Kargaburun tarz� bir alet
Bir �ok par�ay� ma�azalarda bulabilirsiniz. E�er bulamazsan�z en yak�n mimarl�k fak�ltesine ba�vurunuz. ��nk� mimarl�k fak�ltesi ��rencileri bu aletleri bulundururlar. Bu tel pensesinin d�zg�n y�zl� olmas�na dikkat ediniz, aksi takdirde nitinol teli b�kemezsiniz.


[parts]
�ekil 3: Robotun Ana Par�alar�

G�vdenin Yap�m�

G�vde i�in devre kart�n�n 3 par�as�na sahip olmal�y�z.:Bir tane 6*6 delikli ve 2 tane 6*7 delikli yani 2mm �apl� 4 cm boyundaki pirin� t�ple birle�tirilmi� 3.7 cm m�zik teli

[hinge]
�ekil 4: Omurga ve G�� Kayna�� Yolu

Pirin� t�p� 8,17.5 and 8 mm halinde �ekil 4 deki gibi kesiniz. T�p�n �zerine ufak �entikler atarak makas yard�m�yla k�r�lmas�n� sa�layabiliriz.Ortadaki t�p�n 6*6 deliklik kontrol kart�ndan biraz daha uzun olmas� �nemlidir.M�zik teli 3.7 cm uzunlu�unda kesin.Ortadaki t�p sa� ve soldaki t�pler mizk teline lehimlendi�inde rahat�a d�nebilmelidir.
[solder the 3 body parts]
�ekil 5: Kartlar� omurgaya lehimleyin

Ortadaki t�p de �imdi 6*6 delikli denetim kart�na lehimlenmi� olmal�, yaln�z rotasyon hareketi yapabilmesi sa�lanmal�d�r.Di�er iki t�p de di�er iki kontrol kart�na lehimlenmi� olmal�d�r.
�imdi 2*7 delikli bir denetim kart�n� ele alal�m. Bu t�p ortadaki pirin� t�p�n kenar�nda dik bir �ekilde durmal�d�r.Denetim kart� kesici bir aletle �entiklenmi� olmal�d�r ve bunun ortadaki pirin� t�pe lehimlenmi� olmas� gerekmektedir.Bkz �ekil 6:
[the flag]
�ekil 6: Ufak Devre Kart�n� Eklemek

Pirin� t�p� 1 mm kal�nl���nda z�mparalay�n ve 4 mm uzunlu�unda t�p par�alar� kesin.T�p� mutfak b��a�� yard�m�yla b�k�n.Bunun i�in 16 tane tutturucuya(crimp) gereksinim var.
Bu birden �ok tutturma i�lemine ba�lamadan evvel bir par�a nitinolle test etmek gerekir.Nitinol telin bir ucunu �ok ince pirin� t�p�n(1mm d�� �apl�) i�ine koyun ve sonra pirin� t�p� kargaburun tarz� aletle ezeriz.��te bu olaya tutturma denir.Yaln�z burada dikkat etmeniz gereken nokta kargaburunun kalitelisini almakt�r ��nk� pirin� t�pleri s�k��t�rmak i�in gerekli kuvvet �ok b�y�kt�r.Ayr�ca iyibir elektrik ba�lant�s� sa�lamak i�in nitinol telin �zerini 600 gridlik z�mparayla z�mparalamak gerekir.

�imdi ayaklar� hareket ettirmek i�in nitinol teli ba�layaca��z.

[the bridge]
�ekil 7: "k�pr�"

E�er bir k�pr� yapmak istiyorsan�z nitinol teli boydan boya uzatmal�y�z. Bir taraftan ba�layal�m.NItinol teli en son delikten ge�iririz ve bir d���m atar�z(iyi bir ba�lant� sa�layabilmek i�in).Bu d���m�n �zerine bir tutturucu koyal�m ve bu tutturucuyla �yle s�k� ba�layal�m ki nitinol tel ikinci bir deli�i tutabilsin.En a�a��da da nitinol tele bir d���m atal�m ve �zerine bir tuttucu daha ekleyelim ve bu tutturucuyu da s�k�ca ba�layal�m.Bkz �ekil 7
Devam etmeden �nce nas�l �al��t���n� bir deneyelim. Bunun i�in; 1.5 V AA mignom bataryas� kullan�n ve bunu nitinol tellerin birisine ba�lay�n. Tel ba�lant� kurdu�unda g�vdenin orta k�sm� 10 ile 20 derecede d�nebilmelidir.Yaln�z bataryay� 1 sn. den fazla tutmamaya �al���n yoksa ntinol teli yakabilirsiniz.

Bacaklar


[music wire for legs]
�ekil 8: teli b�k�n

10 cm uzunlu�unda m�zik teli keseriz.Bu tellerin ba��nda ve sonunda 1.5 cm lik k�vr�mlar olu�tururuz ve bu 3 teli birbirlerine paralel olarak robotun g�vdesine lehimleriz. Bkz. �ekil 8

[legs top view]

[legs bottom viewl]
�ekil 9, 10: robot �zerindeki bacaklar

�imdi nitinol telini 6 aya�a ba�layaca��z

[leg and nitinol]
�ekil 11: Devindiricilerin eklenmesi

Nitinol telini tutturucunun i�inden ge�irip denetim kart�ndaki deli�e sokar�z bu arada nitinol telinin m�zik teline uzakl��� 3 delik kadar olmal�d�r.Daha sonra tutturucuyu m�zik teliinin �zerinden diz k�vr�m� olu�ana kadar �ekeriz.Bkz.�ekil 11. Nitinol telini bunun i�inden ge�iririz. �imdi i�in en zor k�sm�na geldik.Robotu s�k�ca tutun ve sabitleyin daha sonra ayaklar�n� bak�r telle ba�lay�n.M�zik teli nitinole kar�� bir kuvvet olu�turacakt�r. Bunun i�lemesi i�in nitinol�n gev�ek olmamas� laz�m.M�zik teli bir kontrol kart� deli�i boyunca nitinole do�ru �ekilmeli ve sonra tutturucu baca�a lehimlenmelidir.
[nitinol must not be loose]
�ekil12: Nitinol Tel ile M�zik Teli Ayn� Seviyede


M�zik telinin ve nitnol�n ayn� seviyede oldu�una dikkat edin.Ayaklar nitinol kas�l�rken yukar� ve a�a�� hareket etmemelidirler.Bir bacak sadece arkaya do�ru hareket etmelidir.

Bu i�lemi di�er be� bacak i�in de uygulay�n.Bacaklar ve robotun ortas�nda bulunan pirin� t�pl� m�zik teli h�zl� bir yolu olu�turular.Bu y�zden m�zik teli, bacaklar ve pirin� t�p aras�nda iyi bir ba�lant� olu�acakt�r.Orta g�vde k�sm� di�er par�alardan ba��ms�z olmas�na ra�men(��nk� d�nebiliyor) orada g�zel bir ba�lant� olu�maz.Bu ba�lant�y� geli�tirebilmek i�in 0.1 mm lik verniklenmi� bak�r telden 3 cm al�r�z ve onu yedek bak�r t�b�n �evresine bobin elde edebilmek i�in sarar�z. Bak�r teli d��ar� ��kar�r daha sonra da ortadaki bobini i�teki ayak �iftine lehimleriz.B�ylece bobinin �ekli maksimum esneklilipe sahip olur. Robot haz�r oldu�u zaman 0.5 m uzunlu�unda verniklenmi� bak�r teli kontrol kart� �zerindeki tutturuculara lehimleriz.Daha sonra g�vdeyle tutturucular� kontrolkart�na lehimleriz. 9 tane tele gereksinimimiz vard�r: Bunlar�n 6 tanesi bacaklar i�in 2 tanesi yukar� a�a�� g�rev yapmak i�in 1 tanesi de g�� kayna�� ba�lant�s� i�in. Ayr�ca par�alar�n son k�s�mlar�na ufak konnekt�rleri de lehimleyebiliriz ki b�ylece konnekt�rleri s�r�c� devresi �zerindeki soketlere ba�layabiliriz

 

Y�r�y��

Robotumuz 3 bacakl� y�r�meye uygun �ekilde tasarlanm��t�r. 3 bacakl� y�r�y�� demek 3 baca��n yerde olmas�(2 tanesi bir tarafta 1 tanesi di�er tarafta) ve 3 baca��n da havada olmas� demektir. Robot y�r�rken yerdeki 3 bacakla havadaki 3 bacak ters y�nde hareket ederler
[The gait]
�ekil 14: Y�r�y��



 

Robotun Linux ile denetimi

 

S�r�c� Devresi

Bu devre kart� bize robotun devinimdiricilerini pc yard�m�yla kullanmam�za izin verir.Bilgisayar program�m�z� geli�tirdi�imizde testi ledlerle yapar�z ve sadece robotun kontrol tellerini kart �zerindeki sokete sokar ve ledlerin do�ru �al���p �al��mad���na bakar�z.Bu program� bu deneyi yaparken kullanabilirsiniz. Robotumuz olduk�a a�t�r. Nitinol�n kas�labilmesi i�in 200 - 25- mA ak�m ge�irilmesi gerekmektedir.3 cm uzunlu�undaki bacaktaki nitinol teller 7 Ohm kadar diren� olu�tururlar. Herzaman yaz�l�m� ilk olarak �al��t�r�n.(S�r�c� devresine g�� vermeden �nce).��nk� b�t�n veri pinleri yaz�l�m taraf�ndan nitnol tele zarar vermemek amac�yla kapat�lm��t�r.Bilgisayar� BIOS'u paralel port veri pinlerine rasgele de�i�ik de�erler verir. Bu de�erlerden baz�lar� a��k durumda olabilir.Yani tele 1 sn den fazla uyguland���nda telin zarar g�rmesine neden olabilir.Nitinol�n so�umas� i�in gerekli olan s�re �s�nmas� i�in gerekli olan s�renin 1.5 kat�d�r. Bkz. Devre Diagram� (Hemen a�a��da)

Devre Diagram� :
[circuit]
�ekil 14: Devre Diagram�

�ekil 14'deki devre diyagram�ndan da g�r�ld��� gibi elektronik olarak sabitlenmi� bir g�� deste�i kullanaca��z.Bu da bize kal�c� bir g�� sa�layacak b�ylece paralel portu korumu� olaca��z.D�� elektrik beslemesi yapmak istersek herhangi bir 6-24 V aras� DC g�� kayna�� kullanabiliriz.7805 standart voltaj reg�lat�r�d�r.Burada dikkat etmemiz gereken tek �ey iki tane kapasit�r�n 7805 voltaj reg�lat�r�ne �ok yak�n konulmu� olmal�d�r.Aksi takdirde 7805 �ipimiz zarar g�recektir.G�ncel s�r�c� 8 kere yap�lmal�d�r.BIr tanesi bacak i�in iki tanesi robotun sa�a sola devinimi i�in kullan�lmal�d�r.Biz k�� bir NPN Darlington tranzist�r� kullanaca��z.��nk� bizim robotumuzun �ok miktarda ak�ma gereksinimi var.BC875 veya BC618 500mA civar�nda �al���r. Giri�teki 47K a��k devrenin kapal� olmas�n� sa�lar.Paralel porttaki voltaj seviyesi a��k durumda 4 Volttan fazla, kapal� durumda da 1 voltan azd�r. Tranzist�r devreyi a�ma kapama g�revini yapar.1 Ohmluk diren�ler ak�m� s�n�rlarlar ve robotun ayaklar�n� koururlar ve tabii ki tranzist�rleri de. LED ler de a��k m� kapal� m� oldu�unu g�sterir.�ekil 15 de devrenin resimlerini g�rebilirsiniz. K�rm�z� LED leri(robotun devindiricilerine paralel olan) g�rmek zordur ��nk� bizim kulland���m�z LED'ler saydam k�rm�z�d�r.Konstantan tel bobininden 15 Ohmluk diren�ler yapt�k ,ama bu telden yapmam�z�n nedeni bu telden �ok bulunmas�d�r. 2 W haz�r diren� almak daha uygundur.


[the final drivercircuit1] [the final drivercircuit2]
�kil 15: devre



 

Parallel port

Paralel port bir PC den ��k�� portu olarak �al��mak ve yaz�c� takmak i�in tasarlanm��t�r. Baz� paralel portlar hem giri� hem de ��k�� portu olarak da �al��abilirler.Ama biz burada sadece ��k�� portunu kullanaca��z. Daha sonraki yaz�da sens�rleri robota ba�layaca��z ve giri� hatlar�n� kullanaca��z.Paralel port i�in 25 pin bulunmas�na ra�men biz 9 tane kullanaca��z.Bu hatlardan 8 tanesi veri ��k��� i�in kullana�lacakt�r. Pin ��k��lar� a�a��da g�sterilmi�tir.

25 PIN D-SUB FEMALE at the PC.

 Pin  Name   Dir   Description
 1  STROBE  [-->] Strobe
 2  D0      [-->] Data Bit 0
 3  D1      [-->] Data Bit 1
 4  D2      [-->] Data Bit 2
 5  D3      [-->] Data Bit 3
 6  D4      [-->] Data Bit 4
 7  D5      [-->] Data Bit 5
 8  D6      [-->] Data Bit 6
 9  D7      [-->] Data Bit 7
 10 ACK     [<--] Acknowledge
 11 BUSY    [<--] Busy
 12 PE      [<--] Paper End
 13 SEL     [<--] Select
 14 AUTOFD  [-->] Autofeed
 15 ERROR   [<--] Error
 16 INIT    [-->] Initialize
 17 SELIN   [-->] Select In
 18 GND     [---] Signal Ground
 19 GND     [---] Signal Ground
 20 GND     [---] Signal Ground
 21 GND     [---] Signal Ground
 22 GND     [---] Signal Ground
 23 GND     [---] Signal Ground
 24 GND     [---] Signal Ground
 25 GND     [---] Signal Ground
S�r�c� devresini 18.pine ve veri pinlerine(2-9) ba�lay�n.

Paralel port normalde ��yle �al���r:1 Byte'�n veri hatlar�na yaz�lmas� ve sonra bilgisayar stroboskop hatlar�n� 1 olacak �ekilde ayarlar ,b�ylece bunu yaz�c�ya g�sterir ve veri hatlar� ge�erli olur.Biz veri hatlar�n� do�rudan kulllanaca��z ��nk� stroboskop hatlar� i�in ayr� bir mant��a gereksinimimiz yoktur.

 

Yaz�l�m

Yaz�l�m� adresinden> y�kleyebilirisiniz <.
Bu program� tar zxvf pprobi*.tar.gz komutuyla a�abilirsiniz.Kurulum a��klamalar� bulunmaktad�r

Bu program C dilinde yaz�lm��t�r.Ok tu�lar�n�n yard�m�yla ve space tu�uyla robotu kontrol edebilirsiniz.Robotu y�r�tmek i�in ok tu�lar� ,durdurmak i�in space tu�u kullan�l�r ve q(veya x) tu�uyla programdan ��kabilirsiniz.Ok tu�lar� yerine h,j,k,l tu�lar�n� kullanabilirsiniz.Bacak hareketleri i�in kulland���m�z de�erler robotumuz i�in uygun hale getirilmi�tir.Her robot biraz birbirinden farkl�d�r.Genel olaral t�m nitinol tellerinden ayn� gerilimi almak zordur.Robotunuz yaz�l�mla beraber �al��acakt�r.Ama t�m bacaklar ayn� �ekilde hareket etmeyebilir ve robotunuza uyan en iyi de�erleri bulana kadar biraz deney yapmal�s�n�z.Robotunuzun hi� bir aya�n�n �s�nmamas�na dikkat edin, ayr�ca so�umas� i�in gerekli zaman bulabilmesine dikkat edin .

==== pprobi.c =====
/* vim: set sw=8 ts=8 si : */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License.
 * See http://www.gnu.org/copyleft/ for details.
 *
 * Written by Katja Socher <katja@linuxfocus.org>
 *         and Guido Socher <guido@linuxfocus.org>
 *
 */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <signal.h>

#include "robi.h"

/* ----------- */
static int opt_r=0;
static int fd=0;
/* ----------- */
/* ----------- */
void help()
{
    printf("pprobi -- control software for a walking robot\n\
USAGE: pprobi [-h] [parport-device]\n\
\n\
OPTIONS:\n\
         -h this help\n\
         -r reset the parallel port data pins (all zero) and exit\n\
     \n\
The default device is /dev/parport0 \n\
");
#ifdef VERINFO
    puts(VERINFO);
#endif
exit(0);
}
/* Signal handler: all off then exit */
void offandexit(int code)
{
    robi_setdata(fd,0);
    set_terminal(0);
    exit(0);
}

/* ----------- */
int main(int argc, char **argv)
{
    int state,bpat,alternate;
    char *dev;
    /* The following things are used for getopt: */
    int ch;
        extern char *optarg;
        extern int optind;
        extern int opterr;

    opterr = 0;
    while ((ch = (char)getopt(argc, argv, "hr")) != -1) {
        switch (ch) {
        case 'h':
            help(); /*no break, help does not return */
        case 'r':
            opt_r=1;
            break;
        case '?':
            fprintf(stderr, "serialtemp ERROR: No such option. -h for help.\n");
            exit(1);
        /*no default action for case */
        }
    }
    if (argc-optind < 1){
        /* less than one argument */
        dev="/dev/parport0";
    }else{
        /* the user has provided one argument */
        dev=argv[optind];
    }
    fd=robi_claim(dev); /* robi_claim has its own error checking */
    /* catch signals INT and TERM and switch off all data lines before
     * terminating */
    signal(SIGINT, offandexit);
    signal(SIGTERM, offandexit);

    /* initialize parpprt data lines to zero: */
    robi_setdata(fd,0);
    set_terminal(1); /* set_terminal has its own error handling */
    state=0;
    alternate=0;
    if (opt_r){
        offandexit(1);
    }
        while(1){
        ch=getchoice();
        if (ch!=0) state=ch;
        if (ch == ' '){
            printf("Stop\n");
            robi_setdata(fd,0);
            usleep(500*1000);
        }
        if (ch == 'q'|| ch == 'x'){
            printf("Quit\n");
            break;
        }

        if (state=='l'){
            /*right */
            printf("walking right\n");
            walkright(fd);
        }
        if (state=='h'){
            /*left */
            printf("walking left\n");
            walkleft(fd);
        }
        if (state=='j'){
            printf("walking back\n");
            walkback(fd);
        }
        if (state=='k'){
            if (alternate){
                printf("walking straight on a\n");
                walkstraight_a(fd);
            }else{
                printf("walking straight on b\n");
                walkstraight_b(fd);
            }
            alternate=(alternate +1) %2;
        }

    }
    /* we get here if q was typed */
    set_terminal(0);
    return (0);
}

==== robi.c  =====
/* vim: set sw=8 ts=8 si : */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License.
 * See http://www.gnu.org/copyleft/ for details.
 *
 * Written by Katja Socher <katja@linuxfocus.org>
 *        and Guido Socher <guido@linuxfocus.org>
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <linux/ppdev.h>
#include <sys/ioctl.h>
#include <termios.h>
#include "robi.h"


/* like printf but exit the program */
static int die(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vprintf(fmt, ap);
    va_end(ap);
    exit(1);
}
/* get one character from stdin
 * Returns non zero if char was read otherwise zero
 * The arrow keys are mapped as follows:
 * <- = h
 * -> = l
 * v = j
 * ^ = k
 */
int getchoice()
{
    int c;
    char s[20];

    if (fgets(s,20,stdin)){
        c=s[0];
        switch (c){
            case 0x1b: /* ESC */
                if (s[1] == 0x5b){
                    /* arrow keys are pressed */
                    switch (s[2]){
                        case 0x41: /*up arrow*/
                            c='k';
                            break;
                        case 0x42: /*down arrow*/
                            c='j';
                            break;
                        case 0x44: /*l arrow*/
                            c='h';
                            break;
                        case 0x43: /*r arrow*/
                            c='l';
                            break;
                        default:
                            c=0;
                    }
                }else{
                    c=0;
                }
                break;
            case ' ':
            case 'h':
            case 'j':
            case 'k':
            case 'l':
            case 'q':
            case 'x':
                break;
            default:
                c=0;
        }
        return(c);
    }
    return(0);
}

/* Set the Terminal to Non Canonical mode with echo off
 * or reset the terminal.
 * USAGE: set_terminal(1) for canonical
 */
int set_terminal(int canonical)
{
    static struct termios originalsettings;
    struct termios newsettings;
    static int origok=0; /* set if originalsettings valid */
    if (canonical){
        /* save original settings and set canonical mode*/
        tcgetattr(fileno(stdin),&originalsettings);
        newsettings=originalsettings;
        newsettings.c_lflag &= ~ICANON;
        newsettings.c_lflag &= ~ECHO;
        newsettings.c_cc[VMIN]=0; /* do not block */
        newsettings.c_cc[VTIME]=1; /* 100 ms */
        if (tcsetattr(fileno(stdin),TCSANOW,&newsettings) !=0){
            die("ERROR: could not set terminal attributes on stdin\n");
        }
        origok=1;
    }else{
        if (origok){
            /* restore settings */
            tcsetattr(fileno(stdin),TCSANOW,&originalsettings);
        }
    }
    return(0);
}

/* open /dev/parportX device and claim it.
 * USAGE: fd=robi_claim("/dev/parport0");
 * The return value is a file descriptor used by other
 * functions such as robi_setdata */
int robi_claim(char *dev)
{
    int fd,i;

    fd = open(dev, O_RDWR );
        if (fd < 0) {
                die("ERROR: cannot open device %s\n",dev);
        }
    i=0;
    /* we need exclusive rights as we do not set the control lines*/
    /*ioctl(fd, PPEXCL, &i)&&
           die("ERROR: request for exclusive rights failed\n");*/
    ioctl(fd, PPCLAIM, &i)&&die("ERROR: could not claim parport\n");
    return(fd);

}
/* Walk left
 */
int walkleft(int fd)
{
    /* first B legs to ground */
    robi_setdata(fd,LEGBD);
    usleep(400 *1000);
    /* all A legs 1 step */
    robi_setdata(fd, LEGB1 | LEGB3 );
    usleep(1100 *1000);

    /* first A legs to ground, cool B*/
    robi_setdata(fd,LEGAD);
    usleep(400 *1000);
    robi_setdata(fd,0);
    usleep(1000 *1000);
    return(0);
}
/* Walk right
 */
int walkright(int fd)
{

    /* first A legs to ground */
    robi_setdata(fd,LEGAD);
    usleep(500 *1000);
    robi_setdata(fd,  LEGA3 | LEGAD);
    usleep(300 *1000);
    /* all A legs 1 step */
    robi_setdata(fd, LEGA1 | LEGA3 );
    usleep(1100 *1000);

    /* first B legs to ground, cool A*/
    robi_setdata(fd,LEGBD);
    usleep(400 *1000);
    robi_setdata(fd,0);
    usleep(1000 *1000);
    return(0);
}
/* Walk with all 3 legs 1 step forward
 */
int walkstraight_a(int fd)
{

    /* first A legs to ground */
    robi_setdata(fd,LEGAD);
    usleep(800 *1000);
    /* all A legs 1 step */
    robi_setdata(fd, LEGA1 | LEGA2 | LEGA3 );
    usleep(1000 *1000);

    /* first B legs to ground, cool A*/
    robi_setdata(fd,LEGBD);
    usleep(500 *1000);
    robi_setdata(fd,0);
    usleep(1200 *1000);
    return(0);
}
/* Walk with all 3 legs 1 step forward
 */
int walkstraight_b(int fd)
{
    /* first B legs to ground */
    robi_setdata(fd,LEGBD);
    usleep(400 *1000);
    /* all B legs 1 step */
    robi_setdata(fd,LEGB1 | LEGB2 | LEGB3);
    usleep(1000 *1000);
    /* A down and cool */
    robi_setdata(fd,LEGAD);
    usleep(800 *1000);
    robi_setdata(fd,0);
    usleep(1200 *1000);
    return(0);
}
/* Walk with all 6 legs 1 step back
 */
int walkback(int fd)
{

    /* first A legs to ground */
    robi_setdata(fd,LEGAD);
    usleep(800 *1000);
    /* all B legs 1 step in the air*/
    robi_setdata(fd, LEGB1 | LEGB2 | LEGB3 );
    usleep(500 *1000);

    /* first B legs to ground, cool A*/
    robi_setdata(fd,LEGBD);
    usleep(500 *1000);
    /* all A legs 1 step in the air*/
    robi_setdata(fd,LEGA1 | LEGA2 | LEGA3);
    usleep(500 *1000);
    /* A down and cool */
    robi_setdata(fd,LEGAD);
    usleep(800 *1000);
    robi_setdata(fd,0);
    usleep(1000 *1000);
    return(0);
}
/*---------*/
/* Write a bit pattern to the data lines
 * USAGE: rc=robi_setdata(fd,bitpat);
 * The return value is 0 on success.
 */
int robi_setdata(int fd,unsigned char bitpat)
{
    int rc;

    rc=ioctl(fd, PPWDATA, &bitpat);
    return(rc);
}

==== robi.h =====
/* vim: set sw=8 ts=8 si et: */
#ifndef H_ROBI
#define H_ROBI 1
#define VERINFO "version 0.2"


/* the first thing you need to do: */
extern int robi_claim(char *dev);

/* write a bit pattern to the data lines of the parallel port: */
extern int robi_setdata(int fd,unsigned char bitpat);

/* input and terminal functions */
extern int set_terminal(int canonical);
extern int getchoice();
extern int walkstraight_a(int fd);
extern int walkstraight_b(int fd);
extern int walkback(int fd);
extern int walkleft(int fd);
extern int walkright(int fd);

/* data pins to legs:
 * A1------=------B1
 *         =
 *         =
 * B2------=------A2
 *         =
 *         =
 * A3------=------B3
 *
 *
 * Pin to set A-legs to ground= AD
 * Pin to set B-legs to ground= BD
 *
 * parallel port    leg name
 * -------------------------
 * data 0           A1
 * data 1           A2
 * data 2           A3
 * data 3           AD
 * data 4           B1
 * data 5           B2
 * data 6           B3
 * data 7           BD
 */
#define LEGA1 1
#define LEGA2 2
#define LEGA3 4
#define LEGAD 8
#define LEGB1 16
#define LEGB2 32
#define LEGB3 64
#define LEGBD 128

#endif


Yaz�l�m�m�z 2.4.x �ekirdektenden kalma ppdev programlama aray�z�n� kullan�r.Bu aray�z paralel port ayg�t s�r�c�leri yazmak i�in uygun ve temiz bir aray�zd�r.Eski �ekirdeklere(2.3.x veya 2.4.x den daha d���k s�r�mlerde) yeni bir �ekirdek mod�l� yazmak zorunda kal�r�z veya daha �irkin bir y�ntem kullanabiliriz.Bu y�ntem sadece root'un program� kulanabilmesine izin vermektir. ppdev aray�z� /dev/parport0 ayg�t dosyas�n� kullan�r.Bu dosyan�n kullan�c� izinlerini ayarlayabilmek i�in paralel port aray�z�n� kullanan kullan�c�ya ba�vurun.

ppdev'i bir mod�l olarak �ekirde�in i�ine derlemek istersek PARPORT mod�l�n� PPDEV ayg�t�yla beraberce derlemelyiz.Bu a�a��daki gibi g�z�kecektir.

#
# Parallel port support
#
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_PC_FIFO=y
# CONFIG_PARPORT_PC_SUPERIO is not set
# CONFIG_PARPORT_AMIGA is not set
# CONFIG_PARPORT_MFC3 is not set
# CONFIG_PARPORT_ATARI is not set
# CONFIG_PARPORT_SUNBPP is not set
CONFIG_PARPORT_OTHER=y
CONFIG_PARPORT_1284=y
#
# Character devices
#
CONFIG_PPDEV=m
#


Program ilk olarak paralel portu ioctl komutu olan PPCLAIN ile ba�lat�r.Terminali kuralsal olmayan moda ge�irir(non canonical). Bu do�rudan klavyeden kullan�c�n�n her giri� sonunda enter'a basmas�n� engelleyerek kullan�c�n�n giri� yapmas�n� sa�lar.Daha sonra program herhangi bir kullan�c� giri�i olup olmad���na bakan ve robotu komuta g�re y�neten bir d�ng� i�ine girer.E�er herhangi bir emir vermezseniz program son komutu uygulamaya devam edecektir( y�r�meye devam etmek gibi). ioctl (fd, PPWDATA, &bitpat); komutu veri hatlar�n�n verilmi� �rne�e g�re ayarlanmas� i�in kullan�l�r.

Robotun pinlerinin �ekildeki gibi s�r�c� devresinin ��k�� hatlar�na ba�lanmas� gereklidir.

Bacaklar:
  A1------=------B1
          =
          =
  B2------=------A2
          =
          =
  A3------=------B3


  Pin to set A-legs to ground= AD
  Pin to set B-legs to ground= BD

S�r�c� kart�n�n ��k�� �izgilerinin uyumu :
  data 0           A1
  data 1           A2
  data 2           A3
  data 3           AD
  data 4           B1
  data 5           B2
  data 6           B3
  data 7           BD

Data 0 s�r�c� devresini paralel portun 2.pinine ba�layan ��k��t�r. (D0).

��te, y�r�yen robotumuz:
[yes, it walks]
Bu canlandirim gif'teki biraz daha h�zl� y�r�yor. Ger�ek hayatta nitinol� eski boyuna getirmek i�in gerekli olan so�utma zaman�ndan dolay�; biraz daha yava� y�r�yor.


Robotu yaparken zevk alaca��n�z� umuyoruz. Hadi bize kendi robotunuz hakk�nda bilgi verin; �zellikle sizinki bizimkinden farkl� tasarlanm��sa.

 

Kaynaklar

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Katja and Guido Socher, FDL
LinuxFocus.org

Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz
�eviri bilgisi:
en -> -- Katja and Guido Socher
en -> tr Mert Deva , Tuncer Birtan, Do�ucan Kanal

2001-08-22, generated by lfparser version 2.17