درسته از یه موتور و 4 پایه (بیت) استفاده کردیم ولی با اینطور مقدار دادن به پایه ها 4 بیت دیگه پورت هم مقدار دهی شدن به نظر میرسه دیگه نمیشه ازشون استفاده کرد! پس یعنی باید یکی یکی پایه ها رو مقداردهی کنیم ؟
من قبلاً گفتم که من با بیسیک کار میکنم ولی مهم نیست ما الگوریتمو بررسی میکنیم هر کی واسه خودش برنامه مینویسه:
اولاً حتماً دستوری تو C هست که وقتی شیفت میدی مقدار شیفت شده رو تو بایت برگردونه . بگردین پیداش کنین یا اگه از دوستان حضور ذهن داشتن راهنمایی کنن.
دوماً من حلقه رو طوری نوشتم که به ازای هر گام یه بار سنسورارو اسکن کنه این زیاد وقت برنامه رو نمیگیره
سوماً دیلی 100 میلی خیلی زیاده فکرشو بکنین اگه تو یه ثانیه 10 گام بره جلو برای موتور 2 درجه یعنی 20 درجه و این یعنی 360 تقسیم بر 20 میشه یک هجدهم محیط یک چرخ تو یه ثانیه و این هم یعنی هر 18 ثانیه یه دور که خیلی کمه
چهارماً یا همون رابعاً: برای حرکت دو تا موتور میتونین سه تا زیر تابع در نظر بگیرین. یکیش برای حرکت چرخ راست و پیچیدن به سمت راست و دومی برای چرخ چپ و پیچیدن به سمت چپ. و سومیت تابع برای حرکت هردو موتور و حرکت به سمت جلو. فقط حواستون باشه تو سومی اگه برای دوموتور از از یه پورت استفاده میکگنین، دیلی هارو برای هرموتور نصف کنید. هر چند که اگه میتونید بهتره برای هر موتور از یه پورت مستقل استفاده کنین بهتر و راحت تره و روبات حرکتش روون تر میشه . هنگام استفاده از پورت مشترک ممکنه ربات کم (هر چند خیلی کم) لرزش داشته باشه
5) اگه از پورت مشترک استفاده کردین مثلاً مقدار اولیه میشه 11001100 . اینو تو یه رجیستر نگه میدارین و با 15 که اندش کردین میشه 1100000 و اینو تو یه رجیستری قرار میدین که قراره به پورت اعمال بشه. اونوقت مقدار 0000 برای موتور دوم باعث حرکت نمیشه و در حالت قبلی میمونه و برای موتور دوم هم که با 240 اند میشه، میشه 00001100. و دائم او چهار تا بیت شیفتشون به چشم میاد
ویا میتونین تو توابع هنگام استفاده از هر نیبل ، بیتهای نیبل بعدی رو ورودی معرفی کنین تا امپدانس بالا بشه و بی تأثیر.
در کل گه از مگا 16 یا 32 استفاده میکنین بهتره از پورتای مستقل استفاده کنین
لطفا اگه کسی میدونه تو کدویژن چطوری میشه حلقه ای شیفت داد بگه.
اگه نشد هم که مجبوریم به ترتیب حالت ها رو به پورت بدیم.
راستی برای این ربات فکر میکنم موتور دی سی هم جواب بده. البته نمیدونم الگوریتمی که شما می خواین بگین چطوریه. ربات دو سنسوره زیگ زاگی که تو ذهن منه با دی سی جواب میده. البته مثل اینکه شما گفتید 5 سنسور. منتظر ادامه آموزش هستیم. ممنون.
یه تابع برای شیفت نوشتم. تاحالا برنامه خیلی ساده. سعی کردم تا حد ممکن قابل فهم باشه.
کد:
/*
right motor : PORTB 0,1,2,3
left motor : PORTD 0,1,2,3
*//////////////////////////////////
#include <mega32.h>
#include <delay.h>
void LeftMotor ( );
void RightMotor ( );
void DoubleMotor( );
void Shift (char Value);
char LValue = 0b00001100;
char RValue = 0b00001100;
void main ( )
{
DDRB = 0xFF;
DDRD = 0xFF;
PORTB = 0x00;
PORTD = 0x00;
while (1)
{
delay_ms(20);
//check sensor
//call suitable motor
}
}
void LeftMotor ( )
{
Shift(RValue);
PORTB = RValue;
}
void RightMotor ( )
{
Shift(LValue);
PORTD = LValue;
}
void DoubleMotor( )
{
Shift(RValue);
Shift(LValue);
PORTB = RValue;
PORTD = LValue;
}
void Shift (char Value)
{
if (Value == 0b00001100)
{
Value = 0b00000110;
} else if (Value == 0b00000110)
{
Value = 0b00000011;
} else if (Value == 0b00000011)
{
Value = 0b00001001;
} else if (Value == 0b00001001)
{
Value = 0b00001100;
}
}
چرا گفتین بهتره پورت هر موتور جدا باشه و اینطوری روونتر میره ؟
چون وقتی در حالت پورت مشترک ربات به جلو میره یه گام چرخ راست دور میزنه و بعد دیلی موتور چپ یه گام حرکت میکنه. البته برای رفع این مورد هم میشه بعد اند کردن بایتها با 15 و 240 این دو بایت رو ترکیب کنیم بعد به پورت بدیم.البته این کارها یه خورده پیچیده به نظر میرسه. من بهشون اشاره کردم ولی برای کسی که بخواد برای بار اول ربات بسازه فکر میکنم بهتر بود مطرح نمیشد.
سلام
دوستان در مورد تغذیه ربات هم بحث کنید
برای یه موتور 12 ولتی فکر نکنم که 12 تا باطری 1.5 ولتی رو سری کنیم چون هم حجم زیاد میگیره و هم جریانشون کم هستش ، از 6 ولتی ها هم نمیشه استفاده کرد بازم به دلیل حجم پس چی کارش کنم؟
سه تا باتري موبايل .
باتري MP3 پلاير ها و همينطور گوشي هاي بيسيم هم خوبن !
يا 8 تا باتري نيكل كادميوم ( شا هيدريد فلزي )
البته اگه با سطوح ولتاژ 5 و موتور 5 ولت کار کنیم برای رگولاتور 7805 مقدار 7.5 ولت کافیه. آپ امپاروهم میتونیم با همون 7.5 تغذیه کنیم. نظر شما چیه؟ (مخصوصاً علی آقا)
مهندس هنگامي كه با 324 كار مي كرديم و تغذيه 5 ولت بهشون مي داديم مي ديدم كه خروجي كه به ميكرو مي ره 3.5 ولت بيشتر نيستش و واسه همين تغذيه اپ امپ هامون رو 6 ولت در نظر گرفتيم تا حدود 5 ولت خروجيش باشه !!
تغذيه ميكرو رو همون 5 ولت بود !
مي گن حداقل ولتاژ ورودي آي سي هاي رگولاتور ولتاژ رگولاتور بعلاوه 2 ولت هستش كه براي 5 ولت مي شه حدود 7 ولت و 7.5 ولت رو مي تونيم به رگولاتور 7805 بديم و خروجي 5 بگيريم !
پيشنهاد مي كنم دوتا ديود سري كنيد ( 2*0.7=1.4 ) و بعد يه آپ امپ بدين تا احيانا خروجيش زياد نشه و به ميكرو آسيب برسونه ! ( يعني حدود 6 ولت به آپ امپ بدين و ولتاژ رو با چند تا ديود سري كم كنيد )
البته اگر قرار نيست خروجي آپ امپ به ميكرو وصل بشه مي تونيد به آپ امپ تا 15 ولت دوبل ( يعني 30 ولت ) را بدون هيچ مشكلي بدين !
8 تاباطری رو که سری کردیم ولتاژشون که چمع میشه 12 ولت ولی مشکل جریان کشیدن موتور پیش نیاد؟
می گم بهتر نیست ولتاژ رگوله به موتور بدیم؟
8 تا باتری نیکل کادمیوم سری بشن میشه 9.6 ولت چون اونا 1.2 هستن
بله بهترین ولتاژ کاری برای 324 مقدار 30پیک تو پیک هستش ولی مشکل تو ساخت روبات اینه که ما میخوایم از حداقل ولتاژ ممکن استفاده کنیم. درضمن اگه مقدور باشه بهتره از 358 استفاده بشه .ضمناً من با سری کردن چند تا دیود برای کاهش ولتاژ که تو اکثر مدارهای توی نت هم به چشم میخوره موافق نیستم.چون آپ امپای ما بصورت سوئیچ قراره عمل کنن(نه تقویت کننده) بهتره حداکثر مقدار خروجیو پیشبینی کنیم و براش تقسیم ولتاژ مقاومتی بذاریم.