|
|
|
صنع آلي متحرك يُدَار بلِنُكس |
نبذة
:
في هذا المقال سنصنع آليا يمشي على ست أرجل و نتحكم فيه بحاسوب يعمل بلِنُكس
باستعمال مرافئه المتوازية.أجهزة أخرى يمكن أن تدار بالمرفئ المتوازي.
المقدمة:
سحرنا الآليون دوما، و ما أسعد كلينا حينما عثرنا –منذ زمن - على كتاب عن الآليين
فيه عدة لصنع آلي يشبه الحشرة يدعى Stiquito . ستيكويتو آلي مميز إذ ليس له محرك
بل يمشي على سيقان wired with nitinol يمشي هادئا مشية الحشرة. لكن حين صنعناه
لاحظنا أنّ أرجله لا تتلامس مع الأرض جيدا لذا يمشي مشيا بطيئا جدا. لحسن الحظ يصف
الكتاب تصاميم آليين آخريين استوحينا منها هذا المقال الذي بين يديك عن .
نيتينول:
آلينا لا محرك له يمشي لأن سيقانه مربوطة مشغلة بسلك الننتول "nitinol". النيتينول
سبيكة معدنية من النيكل والتيتانيوم يتقلّص مثل العضلات حين تثار كهربائيا. عندما
يمر في السلك تيار كهربائي يثور و يتقلص ( يعود إلى شكله "غير المتمدّد" ). لابد
من قوة عكسية لإعادة السلك إلى طوله الأصلي. حين تشدّ السلك فقط 3 إلى 5 بالمائة
سلك العضلة ثابتة وموثوقة جدا وتستطيع أن تركض لملايين الدرجات.
لصنعه استعملنا:
· لوحة دارات Circuit board فيها ثقوب مستديرة تمر من الجانبين. اللوحة يجب أن تكون من ايبوكسيد الراتنج epoxid resi وإلا لن تكون قوية بما فيه الكفاية. شاهد الصورة.
|
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- للمرفئ المتوازي وأجزاء إلكترونية أخرى ستراها في المخطط أسفله..
|
شكل2: كلابة معقوفة |
يمكنك أن تجد هذه الادوات في محل للخردوات أو
حيث تباع أجزاء السيارات الصغيرة و الطائرات وغيرها.
إذا لم تستطع الحصول على ماتريد في بلدتك ، ابحث عن جامعة قريبة فيها قسم معماري
فالطلبة ينجزون هياكل و تصاميم و لابد أن تجد محلا يبيع ما تريد كالأنابيب
النحاسية الرقيقةجدا.
حين تشتري كلابة معقوفة تأكد أن فكيها مسطحين و إلا لن تقدر أن تثني سلك
شكل 3: الأجزاء الرئيسية الآلي.
صنع الجسم
للجسم تحتاج في البداية إلى ثلاثة أجزاء من لوحة الدارات , واحد ب 6×6 فتحات و اثنان ب 7×6 فتحات ، و أنبوبا نحاسيا أصفر طوله 4 سنتيمتر و قطره ملميترين 2. و 3.7 سنتيمتر من سلك موسيقي .
شكل 4: العمود الفقري و ناقل
الطاقة
إقطع الإنبوب النحاسي إلى ثلث أجزاء 8مم و 17.5 مم و8 مليمتر حسب الشكل. تستطيع
عمل ذلك بأن تحز الانبوب بالسكين ثم تثنيه. الأنابيب ستنكسر أين جعلت الشقّ
بالسكين. من المهم الذي الإنبوب في المنتصف أطول قليلا من 6
x 6
بطاقة إلكترونية فتحات.
إقطع حوالي 3.7 سنتيمتر من سلك الموسيقى. الطول النهائي يجب أن يكون حول 3 مليمتر
أطول من الأنابيب الـ3 سوية. مرر سلك الموسيقى في الأنابيب الثلاثة.
ينبغي أن يقدر الأنبوب الأوسط على الدوران بينما الحم الآخرين إلى سلك الموسيقى.
شكل 5: لحم اللوحات بالعمود الفقري
الحم الأنبوب الأوسط مع اللوحة ذات 6×6 فتحات و تذكر أنه قادر على الدوران. أما
الأنبوبين الآخرين فيلحمان مع البطاقتين الإلكترونيتين الأخريتين.
و الآن خذ اللوحة الصغرى ذات 7×2 فتحات و ضعها عمودية على الانبوب النحاسي. ابرد
اللوحة بمِبرد ثم الحمها مع الأنبوب الأوسط و اللوحة الوسطى
كما يظهر في الصورة:
شكل 6: إضافة اللوحة الصغرى
خذ الانبوب النحاسي الذي سمكه ملمتر واحد و اقطع
منه 16 جزءا طول الواحد منها 4 ملمترات. اقطعه بحزه بسكين المطبخ ثم ثنيه. وقطع
عدّة 4 مليمتر لمدة طويلة قطع الإنبوب. إطو الإنبوب تحت سكين المطبخ وبعد ذلك يحنيه.
تفحص القطع قبل استعمالها : ضع طرف سلك النتتول في قطع الانبوب النحاسي الرقيق (
الذي قطره 1 ملمتر من الخارج) ثم اضغطه بالكماشة (الكلابة). و هذا هو العقص . تذكر
أن تشتري كلابة جيدا لأن كبس الأنابيب النحاسية يتطلب قوة كبيرة. يمكنك أن تحك
السلك بورق زجاجي ليصبح أكثر إيصالا.
الآن سنربط سلك nitinol اللازم لتحريك السيقان إلى الأعلى و الأسفل.
شكل 7: "الجسر"
حاول أن تربط السلك من الجانبين كأنك تصنع جسرا. شُدّ السلك جيدا بأن تعقده في
الفتحتين القصويين – أقصى الفتحتين – ثم اكبس كل طرف بقطعة من الانبوب النحاسي لتشد
السلك جيدا حسب الشكل 7 .
ابق السلك متوترا أي يجب أن يكون ضيّقا بعض الشيئ – فإذا هززته باصبعك فلا ينبغي أن
يتحرك أكثر من ملمترين أو أربعة. حتى يتسنى للآلي المشي مشيا صحيحا. إلحم القطع مع
اللوحة.
ثم اعمل الشيء نفسه في الجانب الآخر .
قبل أن تواصل يمكنك أن تختبر عمل السلك . صله ببطارية – 1.5 فولط - . حين يتقلص
السلك يجب ان يدور وسط الجسم مابين 10 درجات إلى 20 درجة . و انتبه أن لا تصل السلك
بالبطارية أكثر من ثانية واحدة حتى تتلفه الحرارة.
السيقان
شكل 8: ثني السلك
لصنع السيقان تحتاج إلى ثلاث قطع من سلك الموسيقى. طول القطعة 10سنتمترات و اثن
منها 1.5 سنتيمتر على كلا الجانبين. ثم الحم القطع مع الجسم بحيث تتوازى – يوازي
بعضها بعضا-.
شكل 9،10: سيقان الآلي من الأعلى و الأسفل.
و الآن اربط السلك بالسيقان .
شكل 11: إضافة المشغلات
مرر السلك في قطعة من الانبوب النحاسي و في فتحة في اللوحة تكون بعيدة عن سلك
الموسيقى بثلاث فتحات ثم اكبسه كبسا شديدا (انظر الصورة أعلاه).
ثمّ اسحب الرزة حتى تنحني ركبة الساق. ثم اكبس سلك الننتول كبسا شديدا.
و الآن الجزء الأصعب: ثبت الآلي ببرغي صغير ثم مدد السيقان شريط أو سلك نحاسي إضافي
. قوة سلك الموسيقى تعاكس سلك الننتول- تعمل قوة معاكسة- لهذا نشد سلك الننتول إلى
سلك الموسيقى من خلال فتحة اللوحة ثم يلحم مع الساق.
شكل 12: ربط سلك الننتول و سلك الموسيقى.
تأكد أن تربط السلكين في نفس المستوى إذ يجب أن
تتحرك السيقان إلى الأمام و الوراء و ليس إلى الأعلى و الأسفل
افعل بالسيقان الأخرى نفس الشيء.
تنقل السيقان وسلك الموسيقى و قطع النحاس في وسط الآلي الكهرباء لذا وجب وصلها
معا. الجزء الأوسط طليق و متحرك لذا لا ينقل التيار جيدا لهذا خذ سلكا نحاسيا و
لفه حول الانبوب النحاسي لتحصل على وشيعة صغيرة. ثم اربط السلك الحلزوني إلى
الساقين المتطرفتين و الوسطيين. شكل الوشيعة الحلزوني مرونة قصوى.
الآلي مستعد الآن. الحم اسلاكا نحاسية – سمكها 0.1 مم- طولها 0.5 مترا (أو يزيد)
مع الرزز على اللوحة ثم الحم الجسم مع اللوحة . نحتاج 9 أسلاك، 6 للسيقان، 2
للأعلى و الأسفل وواحد لناقل التيار. الحم أطراف الأسلاك إلى موصّل صغير كي تستطيع
أن تصله بمقبس صغير على مطابق على دائرة السائق.
المشية:
حشرتنا تمشى مشية ثلاثية الأرجل أي ثلاثة فوق و ثلاثة تحت. في كل مرة ترتفع ساقان
من جانب و ساق من الآخر . السيقان التي تلمس الارض تسير إلى الأمام و التي تعلو
تسير إلى الخلف.
شكل 13: المشية
بهذه البطاقة الإلكترونية تتحكم في المشغلات و
تصلها بلالمرفئ المتوازي.
متى طوّرنا حاسوبنا يبرمج نحن إختبرناه أولا مع إل إي دي إس وفقط pluged حين طورنا
برنامجنا اختبرناه بصمامات ضوئة –LED- حتى تاكدنا أن مشيته صحيحة ثم ربطنا الأسلاك
بالمرفئ. عليك ان تفعل ذلك.
الآلي نهم جدا. يحتاج ما بين 200 إلى 250 مليأمبير من التيار تسري في سلك الننتول
لتقلصه فيمشي.
مقاومة السنتمترات الثلاث من سلك الننتول 7 أوم.
إبدأ ا البرامج دائما قبل أن توصل دارة السائق بالتيار لأن البرنامج يطفئ كلّ
دبابيس البيانات في باديء الأمر لمنع تلف سلك nitinol. لأن الحاسوب يضع في دبابيس
البيانات قيما عشوائية قد تكون بعضها مشحونة فتتلف السلك إذا أدرت التيار أكثر من
ثانية واحدة ه. يحتاج تبريد النتنول إلى مرة و نصف من وقت تسخينه:
مخطط الرسم البياني:
شكل 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 .
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..
.
يمكنك تحميل البرنامج من
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 <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
هذا البرنامج يستعمل واجهة البرمجة 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).
وها
هو ذا الآلي:
إنه يتحرّك أسرع قليلا في الصورة المتحركة. في الواقع هو أبطأ قليلا للوقت الذي
يتطلبه تبريد سلك الننتول حتى يعود إلى طوله الأصلي
نتمنّى أنّ تصنع آليا ممتعا. و نرجو أن تعلمنا إذا صممته تصميما مختلفا !
Conrad, J.M., and J.W. Mills: Stiquito: Advanced Experiments with a simple and inexpensive robot. Los Alamitos, Calif.: IEEE Computer Society Press
Conrad, J.M., and J.W. Mills: Stiquito for beginners. Los Alamitos,
Calif.: IEEE Computer Society Press
The two books inspired us to build our robot and introduced us to
nitinol
http://www.dynalloy.com
Here you can order the nitinol wire that is needed for building the
robot.They accept credit cards. The other parts should be available at
your local electronic or hobby stores.
http://www.howstuffworks.com/parallel-port.htm
: how parallel ports work
A general article about parallel ports
The Linux 2.4 Parallel Port Subsystem Chapter 7 User-level device drivers
تعقيبك على هذا المقال:
اضغط الوصلة أدناه اذا أردت التعقيب على هذا المقال
|
الصفحات تحت رعاية الفريق
الفني للينكس فوكاس |
المترجمين:
|
2001-05-15, generated by lfparser version 2.13