بنابراین به دنبال پستهای قبلیام در مورد تجسم حس یا data در پردازش ، اکنون به دنبال ترسیم نمایشهای سهبعدی دادههای ثبتشده از حسگر شارپ IR هستم – اگرچه میتواند هر نوع محدوده یاب باشد.
من با تقلب 2 سروو شروع کردم ، یکی از چپ به راست و دیگری بالا به پایین. دومی فقط به 60 درجه حرکت محدود می شود. من قصد دارم برای شروع هر موقعیت سروو را در یک شبکه نمایش دهم، بنابراین یک شبکه با عرض 180 (x) در 60 ارتفاع (y). فاصله اندازه گیری شده از سنسور موقعیت شاخص z را تشکیل می دهد تا یک نقطه چقدر دور/نزدیک ظاهر شود.
تنظیمات تقریباً یکسان است، آردوینو دادههای حسگر را به همراه موقعیت X و Y سرووها به بافر پورت سریال ضبط و ارسال میکند. پردازش سپس این را انتخاب می کند و یک آرایه را پر می کند. اکنون این بار از آرایه های چند بعدی استفاده می کنم، این آرایه ای است که آرایه های دیگر را ذخیره می کند. من میتوانم فقط یک آرایه از 10800 آیتم (180 * 60) بسازم، اما ساختن آرایهای از 180 آیتم بسیار کارآمدتر است، هر آیتم آرایهای از 60 آیتم دیگر برای ذخیره فاصله اندازهگیری شده است. بنابراین به ازای هر 1 درجه که از چپ به راست حرکت می کنم، 60 موقعیت سروو بالا/پایین و خوانش گرفته شده را ثبت می کنم.
برای تجسم این موضوع، شروع کردم به کشیدن مربع با استفاده از شکل QUAD_STRIP برای ایجاد یک طرح بندی شبکه ای (تصویر بالای پست). البته چون من در واقع از مختصات قطبی (درجه) به جای دکارتی (x,y) استفاده میکنم، پس آنچه سنسور میخواند واقعاً نمیتواند به یک شبکه مسطح ترجمه شود. زیرا وقتی چیزی عمودی را اندازه میگیرد، همه اندازهها متفاوت خواهند بود و وقتی به شبکه صاف من ترجمه شوند، هر چیزی عمودی را کج به نظر میرساند. مشکل این است که اکنون ما سعی می کنیم چیزی را در فضای سه بعدی مشاهده کنیم تا آنقدرها هم عالی به نظر نرسد - بنابراین من یک انیمیشن را برای چرخاندن اندکی شی اضافه کرده ام، وقتی به اندازه کافی نزدیک به یک بخش بزرگنمایی می کنید خوب به نظر می رسد اما در غیر این صورت این فقط یک شکل تصادفی است.
2 راه برای حل این موضوع وجود دارد، اول اینکه می توانیم مختصات خود را به دکارتی تبدیل کنیم. یا میتوانیم شبکهای را که برای نمایش دادههایمان استفاده میشود تغییر دهیم، شکل مورد نیاز اساساً یک قوس 60 درجه است که 180 درجه تراشیده شده است - بنابراین به نوعی شبیه دیواره لاستیک به نظر میرسد. شعاع مورد استفاده برای رسم قوس 60 درجه ما با فاصله گرفته شده از سنسور محاسبه می شود.
قطعات داده سنسور سه بعدی آردوینو
فاصله یاب التراسونیک SRF05 یا سنسور مادون قرمز شارپ GP2Y0A02 (عمدتاً هر نوع سنسور فاصله)
آردوینو دیومیلانو با
برد برد ATMEGA328 / تخته نمونه سازی
جامپر/ سیم های رابط
2x سروو (نیازی به منبع تغذیه بیش از 5 ولت نیست)
براکت های سروو C شکل (I) اینها را به اندازه کافی ارزان کنید به من اطلاع دهید!)
مدار پلاتر سه بعدی آردوینو
با استفاده از پست های زیر باید بتوانید نحوه سیم کشی سنسور و نحوه استفاده از سرووها را بیابید. من از پایه های دیجیتال 9 و 10 برای سرووها و پین آنالوگ 1 برای خواندن سنسور استفاده می کنم.
آموزش آردوینو SRF-05
آموزش سروو آردوینو
نحوه استفاده از فاصله یاب شارپ IR
طرح آردوینو
ما از سروو لیباری و چند حلقه FOR برای کنترل 2 سروو استفاده می کنیم، به ازای هر درجه حرکت، سرووی دیگر را تا 60 درجه کج می کنیم و یک سری از سنسورها را برای هر موقعیت می خوانیم و آنها را میانگین می گیریم. ما این مقادیر را با موقعیت X و Y بر حسب درجه به بافر پورت سریال خروجی می دهیم. در پایان هر حلقه، موقعیت سروو را بازنشانی می کنیم. اگر قرائت سنسور خارج از محدوده عملکرد سروو باشد، ما نیز این کار را انجام می دهیم.
/* luckylarry.co.uk 3D Scan Visualisation for Sharp GP2Y0A02 IR range finder Sends sensor readings for every degree moved by the servo values sent to serial port to be picked up by Processing */ #include // include the standard servo library Servo leftRightServo; // set a variable to map the servo Servo upDownServo; int leftRightPos = 0; // set a variable to store the servo position int upDownPos = 0; const int numReadings = 10; // set a variable for the number of readings to take int index = 0; // the index of the current reading float total = 0; // the total of all readings must be a float to allow totaling of float values int average = 0; // the average int IRpin = 1; // analog pin for reading the IR sensor /* setup the pins, servo and serial port */ void setup() { leftRightServo.attach(9); upDownServo.attach(10); // initialize the serial port: Serial.begin(9600); } /* begin rotating the servo and getting sensor values */ void loop() { for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) { leftRightServo.write(leftRightPos); for(upDownPos = 60; upDownPos < 120; upDownPos++) { upDownServo.write(upDownPos); for (index = 0; index<=numReadings;index++) { // take x number of readings from the sensor and average them float volts = analogRead(IRpin)*0.0048828125; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3 float distance = 65*pow(volts, -1.10); // worked out from graph 65 = theretical distance / (1/Volts)S - luckylarry.co.uk total = total + distance; // update total delayMicroseconds(20); } average = (int) total/numReadings; // create average reading if (average < 20) { average = 20; } if (average > 150) { average = 150; } //average = 0 - average; if (index >= numReadings) { // reset the counts when at the last item of the array index = 0; total = 0; } Serial.print("Y"); Serial.print(upDownPos-60); Serial.print("X"); Serial.print(leftRightPos); Serial.print("Z"); Serial.println(average); } upDownServo.write(60); } leftRightServo.write(0); }
برای جزئیات بیشتر: آردوینو + پردازش - تجسم داده های سنسور سه بعدی