[LinuxFocus-icon]

الرئيسية  |  الخارطه  |  الفهرس  |  بحث


أخبار

|

أرشيف

|

روابط

|

عن LF

 

هذا المقال موجود بالـ: أنجليزي  أسباني  الماني  

convert to palmConvert to GutenPalm
or to PalmDoc


[Photo of the Authors]
تأليف:
كاتجا وجيدو سوتشير

حول المؤلف:
كاتجا مدير التحرير الألماني للينكسفوكس. تحبّ Tux،و الأفلام و التصوير والبحر. صفحتها الرئيسية هنا. جيدو من محبي لاينكس منذ زمن بعيد . يحبّه لأن من صممه أناس نزهاء متفتحون. لهذا ندعوه مصدر مفتوح. صفحته الرئيسية في linuxfocus.org/~guido
 

 
المحتوى:
المقدمة
الننتول
صنع الآلي
المشية
التحكم بالآلي
دارة السائق
المرفأ المتوازي
البرامج
المراجع


 

صنع  آلي متحرك  يُدَار بلِنُكس

 

[Illustration]

نبذة :
في هذا المقال سنصنع آليا يمشي  على ست أرجل و نتحكم فيه بحاسوب يعمل بلِنُكس باستعمال مرافئه المتوازية.أجهزة أخرى يمكن أن تدار بالمرفئ المتوازي.



 

المقدمة:

سحرنا الآليون دوما، و ما أسعد كلينا حينما عثرنا –منذ زمن - على كتاب عن الآليين فيه عدة لصنع آلي يشبه الحشرة يدعى Stiquito . ستيكويتو آلي مميز إذ ليس له محرك بل يمشي على سيقان wired with nitinol يمشي هادئا مشية الحشرة. لكن حين صنعناه لاحظنا أنّ أرجله لا تتلامس مع الأرض جيدا لذا يمشي مشيا بطيئا جدا. لحسن الحظ يصف الكتاب تصاميم آليين آخريين استوحينا منها هذا المقال الذي بين يديك عن .
 

 

نيتينول:

آلينا لا محرك له يمشي لأن سيقانه مربوطة مشغلة بسلك الننتول "nitinol". النيتينول سبيكة معدنية من النيكل والتيتانيوم يتقلّص مثل العضلات حين تثار كهربائيا. عندما يمر في السلك تيار كهربائي يثور و يتقلص ( يعود إلى شكله "غير المتمدّد" ). لابد من قوة عكسية لإعادة السلك إلى طوله الأصلي. حين تشدّ السلك فقط 3 إلى 5 بالمائة سلك العضلة ثابتة وموثوقة جدا وتستطيع أن تركض لملايين الدرجات.



 

صنع  الآلي

لصنعه استعملنا:

·         لوحة دارات Circuit board   فيها ثقوب مستديرة تمر من  الجانبين.  اللوحة يجب أن تكون من ايبوكسيد الراتنج  epoxid resi  وإلا لن تكون قوية بما فيه الكفاية. شاهد الصورة.

[circuitboard]
 

 

شكل1:البطاقةالإلكترونية

o        15× 15 مليمتر، 6 × 6 فتحات (للجسم).

o        إثنان 18× 16 مليمتر، 7× 6 فتحات (للجسم)

o        18× 6 مليمتر أو 7×  2 فتحتين (لهيكل الجسم)

·         الإنبوب النحاسي

o        4 سنتيمتر إنبوب نحاسي: قطر مليمتر من الخارج، مليمتر 1 من الداخل

o        0.5 متر  إنبوب نحاسي: قطر مليمتر 1 من الخارج، تقريبا 0.6 مليمتر من الداخل. نستعمله لثني  سلك nitinol.

·         1 متر من  سلك  nitinol ،.قطره  004 "

·         0.5 مترا من  سلك موسيقى (سلك فولاذي)، قطره  مليمتر 1.

·         5 أمتار  من 0.1 مليمتر سلك cooper  ملمع ( سلك عازل رفيع جدا مثل المستعمل في المحولات . اشتر واحدا أو انزعه من محول قديم).

·         ورق صقل دقيق  600   600 grid fine sandpaper

·          أداة  اللحم، سلك اللِحام  

·         سكين مطبخ حادّ

·         مقص  لقص السلك

·         كلابة معقوفة

·         موصّل ذكر  ذو 25  دبوس 25pin-  للمرفئ المتوازي وأجزاء إلكترونية أخرى ستراها في المخطط أسفله..



[pliers]

شكل2: كلابة معقوفة

يمكنك أن تجد هذه الادوات في محل للخردوات أو حيث تباع أجزاء السيارات الصغيرة و الطائرات وغيرها.
إذا لم تستطع الحصول على ماتريد في بلدتك ، ابحث عن جامعة قريبة فيها قسم معماري فالطلبة ينجزون هياكل و تصاميم و لابد أن تجد محلا يبيع ما تريد كالأنابيب النحاسية الرقيقةجدا.
حين تشتري كلابة معقوفة تأكد أن فكيها مسطحين و إلا لن تقدر أن تثني سلك


[parts]
شكل 3: الأجزاء الرئيسية الآلي. 

 

صنع  الجسم

للجسم تحتاج في البداية  إلى ثلاثة أجزاء من لوحة الدارات , واحد ب 6×6 فتحات و  اثنان ب 7×6 فتحات ،  و  أنبوبا نحاسيا أصفر  طوله 4 سنتيمتر و قطره ملميترين 2. و 3.7 سنتيمتر من سلك موسيقي .



[hinge]
 

شكل 4: العمود الفقري و ناقل الطاقة

إقطع الإنبوب النحاسي إلى ثلث أجزاء  8مم و  17.5 مم و8 مليمتر حسب الشكل. تستطيع  عمل ذلك بأن تحز الانبوب بالسكين ثم تثنيه.  الأنابيب ستنكسر أين جعلت الشقّ بالسكين. من المهم الذي الإنبوب في المنتصف أطول قليلا من 6
x 6 بطاقة إلكترونية فتحات. إقطع حوالي 3.7 سنتيمتر من سلك الموسيقى. الطول النهائي يجب أن يكون حول 3 مليمتر أطول من الأنابيب الـ3 سوية.  مرر سلك الموسيقى في  الأنابيب الثلاثة.

ينبغي أن يقدر الأنبوب الأوسط على الدوران  بينما الحم الآخرين إلى سلك الموسيقى.


[solder the 3 body parts]
شكل 5: لحم اللوحات بالعمود الفقري

الحم الأنبوب الأوسط مع اللوحة ذات 6×6 فتحات و تذكر أنه قادر على الدوران. أما الأنبوبين الآخرين فيلحمان مع البطاقتين الإلكترونيتين الأخريتين.
و الآن خذ اللوحة الصغرى ذات 7×2 فتحات و ضعها عمودية على الانبوب النحاسي. ابرد اللوحة بمِبرد ثم الحمها مع الأنبوب الأوسط و اللوحة الوسطى
كما يظهر في الصورة:

[the flag]
شكل 6: إضافة اللوحة الصغرى

خذ الانبوب النحاسي الذي سمكه ملمتر واحد و اقطع منه 16 جزءا طول الواحد منها 4 ملمترات. اقطعه بحزه بسكين المطبخ ثم ثنيه. وقطع عدّة 4 مليمتر لمدة طويلة قطع الإنبوب. إطو الإنبوب تحت سكين المطبخ وبعد ذلك يحنيه.
تفحص القطع قبل استعمالها : ضع طرف سلك النتتول في قطع الانبوب النحاسي الرقيق ( الذي قطره 1 ملمتر من الخارج) ثم اضغطه بالكماشة (الكلابة). و هذا هو العقص . تذكر أن تشتري كلابة جيدا لأن كبس الأنابيب النحاسية يتطلب قوة كبيرة. يمكنك أن تحك السلك بورق زجاجي ليصبح أكثر إيصالا.
الآن سنربط سلك nitinol اللازم لتحريك السيقان إلى الأعلى و الأسفل.

[the bridge]
شكل 7: "الجسر"

حاول أن تربط السلك من الجانبين كأنك تصنع جسرا. شُدّ السلك جيدا بأن تعقده في الفتحتين القصويين – أقصى الفتحتين – ثم اكبس كل طرف بقطعة من الانبوب النحاسي لتشد السلك جيدا حسب الشكل 7 .
ابق السلك متوترا أي يجب أن يكون ضيّقا بعض الشيئ – فإذا هززته باصبعك فلا ينبغي أن يتحرك أكثر من ملمترين أو أربعة. حتى يتسنى للآلي المشي مشيا صحيحا. إلحم القطع مع اللوحة.
ثم اعمل الشيء نفسه في الجانب الآخر .
قبل أن تواصل يمكنك أن تختبر عمل السلك . صله ببطارية – 1.5 فولط - . حين يتقلص السلك يجب ان يدور وسط الجسم مابين 10 درجات إلى 20 درجة . و انتبه أن لا تصل السلك بالبطارية أكثر من ثانية واحدة حتى تتلفه الحرارة.

السيقان


[music wire for legs]
شكل 8: ثني السلك

لصنع السيقان تحتاج إلى ثلاث قطع من سلك الموسيقى. طول القطعة 10سنتمترات و اثن منها 1.5 سنتيمتر على كلا الجانبين. ثم الحم القطع مع الجسم بحيث تتوازى – يوازي بعضها بعضا-.

[legs top view]

[legs bottom viewl]
شكل 9،10: سيقان الآلي من الأعلى و الأسفل.

و الآن اربط السلك بالسيقان .


[leg and nitinol]
شكل 11: إضافة المشغلات

مرر السلك في قطعة من الانبوب النحاسي و في فتحة في اللوحة تكون بعيدة عن سلك الموسيقى بثلاث فتحات ثم اكبسه كبسا شديدا (انظر الصورة أعلاه).
ثمّ اسحب الرزة حتى تنحني ركبة الساق. ثم اكبس سلك الننتول كبسا شديدا.
و الآن الجزء الأصعب: ثبت الآلي ببرغي صغير ثم مدد السيقان شريط أو سلك نحاسي إضافي . قوة سلك الموسيقى تعاكس سلك الننتول- تعمل قوة معاكسة- لهذا نشد سلك الننتول إلى سلك الموسيقى من خلال فتحة اللوحة ثم يلحم مع الساق.

[nitinol must not be loose]
شكل 12: ربط سلك الننتول و سلك الموسيقى.


 

تأكد أن تربط السلكين في نفس المستوى إذ يجب أن تتحرك السيقان إلى الأمام و الوراء و ليس إلى الأعلى و الأسفل

افعل بالسيقان الأخرى نفس الشيء.
تنقل السيقان وسلك الموسيقى و قطع النحاس في وسط الآلي الكهرباء لذا وجب وصلها معا. الجزء الأوسط طليق و متحرك لذا لا ينقل التيار جيدا لهذا خذ سلكا نحاسيا و لفه حول الانبوب النحاسي لتحصل على وشيعة صغيرة. ثم اربط السلك الحلزوني إلى الساقين المتطرفتين و الوسطيين. شكل الوشيعة الحلزوني مرونة قصوى.
الآلي مستعد الآن. الحم اسلاكا نحاسية – سمكها 0.1 مم- طولها 0.5 مترا (أو يزيد) مع الرزز على اللوحة ثم الحم الجسم مع اللوحة . نحتاج 9 أسلاك، 6 للسيقان، 2 للأعلى و الأسفل وواحد لناقل التيار. الحم أطراف الأسلاك إلى موصّل صغير كي تستطيع أن تصله بمقبس صغير على مطابق على دائرة السائق.
 

 

المشية:
حشرتنا تمشى مشية ثلاثية الأرجل أي ثلاثة فوق و ثلاثة تحت. في كل مرة ترتفع ساقان من جانب و ساق من الآخر . السيقان التي تلمس الارض تسير إلى الأمام و التي تعلو تسير إلى الخلف.
[The gait]
شكل 13: المشية



 

التحكم بالآلي بلينكس من الحاسوب

 

دارة السائق

 

بهذه البطاقة الإلكترونية تتحكم في المشغلات و تصلها بلالمرفئ المتوازي.
متى طوّرنا حاسوبنا يبرمج نحن إختبرناه أولا مع إل إي دي إس وفقط pluged حين طورنا برنامجنا اختبرناه بصمامات ضوئة –LED- حتى تاكدنا أن مشيته صحيحة ثم ربطنا الأسلاك بالمرفئ. عليك ان تفعل ذلك.
الآلي نهم جدا. يحتاج ما بين 200 إلى 250 مليأمبير من التيار تسري في سلك الننتول لتقلصه فيمشي.
مقاومة السنتمترات الثلاث من سلك الننتول 7 أوم.
إبدأ ا البرامج دائما قبل أن توصل دارة السائق بالتيار لأن البرنامج يطفئ كلّ دبابيس البيانات في باديء الأمر لمنع تلف سلك nitinol. لأن الحاسوب يضع في دبابيس البيانات قيما عشوائية قد تكون بعضها مشحونة فتتلف السلك إذا أدرت التيار أكثر من ثانية واحدة ه. يحتاج تبريد النتنول إلى مرة و نصف من وقت تسخينه:
 

مخطط الرسم البياني:
[circuit]
شكل 14: مخطط الرسم البياني

كما ترى في المخطط نستعمل تركيبا كهربائيا حافظا لاستقرار الطاقةelectronically stabilized power supply. حتى نحمي المرفأ و نوفر تيارا منتظما. يمكنك استعمال مولدا للتيار المستمر DC قوته مابين 6-24 فولط. الـ7805 منظّم توتر – فولطية- قياسي. ما يلفت النتباه أن المكثفتين ذوات 450 ميكروفاراد و 0.1 ميكوافاراد موضوعتان بعناية بجانب الدارة 7805 و إلا قد يزداد تواتر الدارة 7805 فتتلف.
نحتاج إلى ثمانية داراة سائقة واحدة لكل سلق و اثنتان تحريك الألي- السيقان إلى أعلى و أسفل-.
نستعمل ترنزستور NPN دارلنجتون صغير لأن الآلي يحتاج الكثير من التيار. الدارات BC875 or BC618 تستطيع أن تنقل حوالي 500 mA.
الدارة 47K تضمن أن دارة مفتوحة (مثلا الحاسوب غير موصول) مكافئة دائما للانطفاء off. في المرفأ المتوازي التوتر 4 فولط يقابل التسغيل –on- و 1فولط يقابل الانطفاء –off-. الترنزستور يعمل مفتاحا- قاطعا- فقط. المقاومات ذات 15 أوم تحدّد شدة التيار و تحمي سيقان الآلي و كذلك الترانزيستورات. أما الصمامات الضوئية فتظهر الحالة إما تشغيل أو انطفاء.

و في الأسفل ترى الدارة.
تحتك يرى صور الدائرة. الصمامات الضوئية الحمراء ( المقابلة لمشغّلات الآلي) تصعب رؤيتها لأننا استعملنا صمامات حمراء شفافة. و قد صنعنا المقاومات ذات 15 أوم من سلك constantan لما لدينا منه من كميات كبيرة لكن من الأرخص شراء مقاومات 2 W .
 


[the final drivercircuit1] [the final drivercircuit2]
Fig 15: the circuit



 

الميناء المتوازي
المرفأ المتوازي صمم مرفأ خروج من الحاسوب و يربط بالطابعة. بعض المرافئ تستعمل للإدخال و الإخراج . أما نحن فسنستعمل الإخراج فقط.
في مقالة قادمة سنزود الآلي بمجسات و سنستخدم المرافئ للإدخال. للمرفأ 25 دبوسا نستعمل تسعةمنها فقط ثمانية منها لنقل البيانات والتاسع وصلة أرضية gnd.
إليك وصفا لدبابيس المرفأ
 

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

صل دارة السائق إلى الدبوس 18 و الدبابيس من 2 إلى 9.
يكتب الحاسوب البيانات في خطوط البيانات في المرفأ المتوازي ثم يضع القيمة 1 في الدبوس strobe ليعلم الطابعة أن البيانات جاهزة الآن. سنستعمل خطوط البيانات فقط لأننالا نحتاج خطّ strobe..
.

 

The software

يمكنك تحميل البرنامج من   software from > here <.

فك ضغطه بالأمرtar zxvf pprobi*.tar.gz

و ستجد فيه تعليمات التنصيب.

البرنامج يكتب بلغة C سي . بمفاتيح التوجية و المسافة تسيطر على الآلي ليسير إلى الأمام و إلى اليمين و الشمال. استعمل مفتاح المسافة لتوقفه و المفتاح q أو x لتغادر البرنامج. بدلا من مفاتيح التوجيه استعمل مفاتيح h ,j,k,l ( مفاتيح vi) إن كنت من محبي vi . إنّ القيم التي استعملناها مثالية لحركة سيقان. لكن كل آلي مختلف قليلا إذ من الصعب الحصول على نفس التوتر على كل أسلاك الننتول. آليك سيعمل بالبرنامج لكنه قد لا يمشي مشية صحيحة لذا عليك انم تجرب و تجرب لتضبط القيم التي تناسبك. احترس أن لا يخن ساق ما أكثر من اللازم أو لا يكفيه الوقت ليبرد.
 

==== 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 <[email protected]>
 *         and Guido Socher <[email protected]>
 *
 */
#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 <[email protected]>
 *        and Guido Socher <[email protected]>
 *
 */
#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


هذا البرنامج يستعمل واجهة البرمجة ppdev التي تعمل على نواة 2.4.x ( تحتاج إلى نواة 2.3.x أو 2.4.x أو أكثر و لا يعمل بالأنوية القديمة .)
هذه الواجهة طيعة سهلة لكتابة برامج تستعمل المرافئ المتوازية .
أما في الأنوية السابقة فالأمر مختلف : إما أن تضيفجزءا إلى النواة أو تستعمل طريقة شاقة إذ المدير root فقط من يمكنه تنفيذ البرنامج .
الواجهة ppdev تستعمل الملف /dev/parport 0 وبتعديل مالك هذا الملف ورخصه تستطيع أن تراقب استعمل هذه الواجهة.
لتصريف (ترجمة compile) جزء ppdev مع النواة صرف معه الجزء PARPORT. ثم اطلع على الملف .config
 

#
# 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
#



أولا يعد البرنامج المرفا بالأمر ioctl command PPCLAIM l . ثم يعدل المطراف terminal إلى النمط غير القياسي non canonical mode . للحصول على المدخلات من لوحة المفاتيح مباشرة دون أن يؤكد المستعمل بزر الإدخال .

ثم يبقى ينتظر أوامر المستعمل الجديدة بينما يبقى ينفذ الأوامر السابقة. إذا لم يأمر المستعمل بشيء فالىلي سيمشي إلى الأمام.
يعدل قيم خطوط البيانات حسب القيمة المدخلة. ioctl(fd, PPWDATA, &bitpat); الأمر
اربط دبابيس الألي إلى خطوط الإخراج في دارة السائق كما يأتي :
 

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

الدبوس الذي يعدم التيار في السيقانAو B
  Pin to set A-legs to ground= AD
  Pin to set B-legs to ground= BD

Corresponding output lines of the driver circuit:ما يقابل خطوط الإخراج في دارة السائق  
  data 0           A1
  data 1           A2
  data 2           A3
  data 3           AD
  data 4           B1
  data 5           B2
  data 6           B3
  data 7           BD

البيان DATA0    مخرج  لدارة السائق التي ترتبط بالدبوس 2(D0)  للمرفأ.

Data 0 is the output of the driver circuit that connects to the parallel port at pin 2 (D0).



وها هو ذا الآلي:
[yes, it walks]
إنه يتحرّك أسرع قليلا في الصورة المتحركة. في الواقع هو أبطأ قليلا للوقت الذي يتطلبه تبريد سلك الننتول حتى يعود إلى طوله الأصلي



نتمنّى أنّ تصنع آليا ممتعا. و نرجو أن تعلمنا إذا صممته تصميما مختلفا !

 

 

المراجع

 

تعقيبك على هذا المقال:

اضغط الوصلة أدناه اذا أردت التعقيب على هذا المقال

 صفحة التعقيب 


الصفحات تحت رعاية الفريق الفني للينكس فوكاس
© Katja and Guido Socher, FDL
LinuxFocus.org

اضغط هنا للتنبيه عن خطأ أو ارسال ملاحظاتك الى لينكس فوكاس

المترجمين:

en

->

--

Katja and Guido Socher

en

->

en

Katja and Guido Socher

en -> ar طه زرقي

2001-05-15, generated by lfparser version 2.13