আমার কম্পিউটারে আরডুইনো এবং একটি প্রসেসিং স্কেচের মধ্যে ব্যবধান হ্রাস করা


13

আমি বর্তমানে আরডিনো প্রকল্প বইয়ের # 14 প্রকল্পে আছি।

আমি আমার আরডিনো ব্যবহার করে আমার ল্যাপটপে একটি প্রসেসিং স্কেচ নিয়ন্ত্রণ করার চেষ্টা করছি। এটি একটি চিত্রের পটভূমি নিয়ন্ত্রণ করতে একটি পেন্টিওমিটার ব্যবহার করে সম্পন্ন হয়।

আরডুইনো কোড:

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.write(analogRead(A0)/4);
}

প্রক্রিয়াকরণ:

//imports serial library
import processing.serial.*;
//setups the serial object
Serial myPort;
//creates an object for the image
PImage logo;
//variable to store background color
int bgcolor = 0;

void setup(){
  colorMode(HSB,255);
  logo = loadImage("http://arduino.cc/logo.png");
  size(logo.width,logo.height);
  println("Available serial ports");
  println(Serial.list());
  myPort = new Serial(this,Serial.list()[0],9600);
}
//equivalent of arduino's loop function
void draw(){
  if(myPort.available() > 0)
  {
    bgcolor = myPort.read();
    println(bgcolor);
  }

  background(bgcolor,255,255);
  image(logo,0,0);
}

এখন, কোডটি কাজ করার সময় এবং আমি পেন্টিওমিটারটি ঘুরিয়ে দেওয়ার সাথে সাথে পটভূমির রঙ পরিবর্তিত হচ্ছে , পোটিনোমিটারটি ঘুরিয়ে দেওয়া এবং পটভূমি পরিবর্তন রঙ দেখার মধ্যে এবং প্রসেসিংয়ের সিরিয়াল মনিটরে আরডুইনো / পন্টিওমিটার পরিবর্তনের মধ্যে একটি বিশাল পিছনে আছে।

আমি যা চেষ্টা করেছি:

  • সিরিয়াল যোগাযোগের গতি পরিবর্তন করা

আমি লক্ষ করেছি যে আমি যখন সিরিয়াল যোগাযোগের গতি হ্রাস করি, যেমন প্রায় 100, তখন পেন্টিয়োমিটার ঘুরিয়ে দেওয়ার এবং এটি আমার ল্যাপটপে পরিবর্তন দেখা দেখার মধ্যে দেরি হ্রাস পায় প্রায় 1 সেকেন্ডে। যাইহোক, আমি যখন সিরিয়াল যোগাযোগের গতি আরও কমিয়ে আনি, উদাহরণস্বরূপ 1 এর মান, তখন বিলম্বটি আবার বেড়ে যায়।

ফ্লিপ দিকে, 9600 স্ট্যান্ডার্ড গতিতে, ল্যাপটপ / প্রসেসিংয়ে পেন্টিয়োমিটারের পরিবর্তনের আগে প্রায় 5 সেকস ++ দেরি বিশাল।

কেন যোগাযোগের গতি হ্রাস (একটি নির্দিষ্ট পয়েন্ট অবধি) সময়ের ব্যবধান হ্রাস পাবে এবং এটি বৃদ্ধি করা সময়ের ব্যবধান বৃদ্ধি করবে? এছাড়াও, আমি কি তা কি তাত্ক্ষণিক কাছাকাছি করতে পারি?


3
আপনি প্রতি একক সময় আরডুইনোর চারপাশে একটি পাঠ্য আউটপুট দিচ্ছেন loop()। এটি বেশ সম্ভব যে আপনার প্রসেসিং প্রোগ্রামটি এটি চালিয়ে যাওয়ার জন্য পর্যাপ্ত দ্রুত চলমান না। loop()আপনার আড়ডিনো কোডটি কমিয়ে দেওয়ার জন্য বিলম্ব করার চেষ্টা করুন ; যেমন delay(50)
পিটার ব্লুমফিল্ড

হাই পিটার, তাত্ক্ষণিক উত্তরের জন্য ধন্যবাদ, একটি সামান্য দেরি যুক্ত করে আমার সমস্যাটি সত্যিই সমাধান করেছে। যদিও আরও একটি ছোট প্রশ্ন, ভবিষ্যতে আমার প্রসেসিং প্রোগ্রামের গতি নির্ধারণ করার কোনও উপায় কি তাই যাতে এটি আবার না ঘটে, বা আরও ভাল ল্যাপটপ / প্রসেসিং গতির সমস্যাটি সমাধান করে? ? এছাড়াও, কেন 250 এর একটি যোগাযোগ গতি বা Arduino থেকে রিডিং 300 জগাখিচুড়ি প্রবেশ করে (রিডিং আমি পাই পড়া এবং শূন্য যেমন 147,0,147,0 মধ্যে বিকল্প হয়)
কেনেথ .J

উত্তর:


11

আপনি আরডুইনোকে ঘিরে প্রতিবার একটি আউটপুট আউটপুট দিচ্ছেন loop(), সুতরাং মনে হচ্ছে আপনার প্রসেসিং প্রোগ্রামটি এটি চালিয়ে যাওয়ার জন্য যথেষ্ট দ্রুত চলছে না। loop()এটি কমিয়ে দেওয়ার জন্য আপনার আরডিনো কোডটিতে বিলম্ব করার চেষ্টা করুন , যেমন:

void loop(){
    Serial.write(analogRead(A0)/4);
    delay(50);
}

যতদূর আমি জানি, প্রসেসিংয়ের লক্ষ্য একটি ধারাবাহিক ফ্রেমরেটে চালানো, যা আপনি frameRate()ফাংশনটি ব্যবহার করে সংশোধন করতে পারেন । ডিফল্টরূপে এটি প্রতি সেকেন্ডে 60 ফ্রেম, যদিও এটি পুরানো সিস্টেমে ধীরে ধীরে চলতে পারে (বা যেখানে আপনি একটি নিবিড় প্রোগ্রাম চালাচ্ছেন)। frameRateভেরিয়েবলটি পড়ে আপনি এটি কত দ্রুত চালাচ্ছেন তা পরীক্ষা করতে পারেন ।

আরডুইনো লুপটিতে 50 মিলিসেকেন্ড বিলম্বের অর্থ এটি প্রতি সেকেন্ডে 20 বারের চেয়ে কিছুটা কম আপডেট হবে। এর অর্থ এটি ব্যবহারকারীর ইন্টারফেসের উদ্দেশ্যে যথেষ্ট দ্রুত হওয়া উচিত, তবে আপনার প্রসেসিং প্রোগ্রামের দক্ষতার মধ্যেও ভাল হওয়া উচিত।

যতদূর বাউড রেট (যোগাযোগের গতি) সম্পর্কিত, এটিকে নির্বিচারে পরিমাণে সমন্বয় করলে অনাকাঙ্ক্ষিত ফলাফল হতে পারে। এটি কারণ হার্ডওয়্যার কেবল নির্দিষ্ট গতি সমর্থন করবে এবং অন্য যে কোনও কিছু ব্যবহারের চেষ্টা করার ফলে অন্য প্রান্তে ডেটা গল্ফ হয়ে উঠতে পারে। Serial.begin()ডকুমেন্টেশন সমর্থিত বড হার সম্পর্কে আরো কিছু তথ্য আছে।


14

ইতিমধ্যে নির্দেশিত হিসাবে, আপনার আরডুইনো খুব দ্রুত বলছে। যোগ করা delay()এটি ধীর করে দেবে, তবে এখনও এটি প্রক্রিয়াজাতকরণে চিৎকার করে। আদর্শভাবে, আপনি প্রসেসিংটি যখন সুবিধাজনক হয় তখন মানটির জন্য জিজ্ঞাসা করতে চান এবং তারপরে আপনার আরডুইনোর কাছ থেকে একটি উত্তর পান।

প্রবেশ করুন SerialEvent()

হিসাবে বিরোধিতা loop()আপনার Arduino এবং draw()ভিতরে সবকিছু প্রসেসিং মধ্যে serialEvent()শুধুমাত্র excutes যখন সিরিয়াল বাফারে কিছু নতুন। সুতরাং যত দ্রুত সম্ভব প্রশ্ন জিজ্ঞাসা করার পরিবর্তে এবং আপনার আরডুইনো আরও দ্রুত চিত্কার করার পরিবর্তে, তারা একটি সুন্দর, ভদ্র (অ্যাসিনক্রোনাস) কথোপকথন করতে পারেন।

প্রসেসিং এবং আরডুইনো উভয়েরই সিরিয়াল ইভেন্ট রয়েছে। এই Arduino উপর serialEvent () হল এবং এই serialEvent () প্রসেসিং হয়। উভয় পক্ষেই সিরিয়াল ইভেন্ট ব্যবহার করে, এটিই ঘটবে:

  1. প্রসেসিং সিরিয়াল সংযোগে একটি অক্ষর প্রেরণ করে। এটি কোনও চরিত্র হতে পারে, তবে আমরা যদি পূর্ব নির্ধারণ করি তবে আমরা যেমন কোনও গোলমাল সিগন্যালজনিত কোনও অযাচিত অনুরোধগুলি ফিল্টার আউট করতে পারি। এই উদাহরণস্বরূপ, আসুন Vপ্রতিবার আমরা আপনার পটোমিটারের নতুন পাঠ চাই send চরিত্রটি প্রেরণের পরে, আমরা যথারীতি আমাদের ব্যবসা চালিয়ে যাই। এখানে একটি উত্তরের জন্য অপেক্ষা না!

  2. আরডুইনো দিক থেকে কিছুই ঘটছে না, যতক্ষণ না এটি সিরিয়াল বাফারে ডেটা প্রাপ্ত হয়। এটি আসন্ন চরিত্রটি একটি Vএবং আমাদের ভাগ্যবান কিনা তা যাচাই করে । আরডুইনো একবার পটামিটারের মান পড়েন, সেই মানটিকে একবার সিরিয়ালে আউটপুট করে এবং শীতল হয়ে ফিরে যান, সর্বোপরি শীতল হয়ে উঠুন। প্রতিলিপি: একটি অক্ষরের সাথে মানটি সমাপ্ত করুন ( *আমাদের ক্ষেত্রে)। এটি আপনাকে পরবর্তী পদক্ষেপে সহায়তা করবে।

  3. ক্রিয়াকলাপটি তার নিয়মিত ইন্টারফেসি পিক্সেল ব্যবসা করছে যখন হঠাৎ সিরিয়াল বাফারে নতুন ডেটা বল প্রয়োগে কোনও ঝামেলা হয়serialEvent()আমাদের সীমাবদ্ধতার *সম্মুখীন না হওয়া অবধি এটি স্যুইচ করে এবং সিরিয়াল ডেটা পড়া শুরু করে । এটি পড়ার উপযুক্ত চরিত্রটি নিশ্চিত ছিল তা জানতে পেরে, আমরা এখন আসন্ন মানটি একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করতে পারি যা আরডুইনোর পঠন সংরক্ষণ করে।

  4. এটাই. প্রক্রিয়াজাতকরণে এখন নতুন সেন্সরটির মানটি জানে এবং আমরা এটি করতে যা বলি তা চালিয়ে যায়। ইতিমধ্যে, আপনার আরডিনো আবহাওয়া উপভোগ করছে বা আগত সিরিয়াল ডেটা না পাওয়া পর্যন্ত এর অস্তিত্ব সম্পর্কে চিন্তাভাবনা করছে।


1
এবং আপনি যখন এটির দিকে আসছেন, আপনার পামিটারের সাথে সমান্তরালে একটি ক্যাপাসিটার রাখুন। এটি আপনার ড্যাকের ইনপুটটিতে সামান্য পরিবর্তন আনা সহজতর করে প্রক্রিয়াজাতকরণের মধ্যে জটিলতার গতি রোধ করে।
টম

এই সুন্দর (এবং ক্যান্ডা নৃতাত্ত্বিক) জবাবের জন্য আপনাকে ধন্যবাদ!
জিটা.ইনকোভেস্টর

আসলে, ইউএসবি মাধ্যমে প্রশ্ন জিজ্ঞাসা একটি ধারণা হতে পারে। এটি কারণ সিরিয়াল পোর্টের তুলনায় ইউএসবিতে অনেক বেশি বিলম্ব রয়েছে, তাই কোনও প্রশ্ন জিজ্ঞাসা করা এবং প্রতিক্রিয়াটির জন্য অপেক্ষা করা অন্যথায় হওয়া চেয়ে বেশি সময়সাপেক্ষ অপারেশন, বিশেষত উচ্চ বাউড রেটে কী করা যায় তার তুলনায়। আরডুইনোকে একটু দ্রুত চালানো দেওয়া ঠিক আছে (যদিও এটি লিঙ্কের ক্রমিক অংশটি পরিপূর্ণ করা উচিত নয়); ক্যাচটি হ'ল প্রসেসিং স্কেচটি আরডুইনো ডেটা উপলভ্য হওয়ার সাথে সাথেই ড্রেন করা উচিত এবং যখন এটির প্রয়োজন হয় তখন ব্যবহারের জন্য শেষ সম্পূর্ণ মানটি ধরে রাখুন।
ক্রিস স্ট্রাটন

7

আপনার পোলিং লুপটি আপনার প্রসেসরের পুরো গতিতে চলে এবং প্রতিটি রাউন্ডে সিরিয়াল পোর্টে লিখে।

এই পদ্ধতিতে, আপনি সিরিয়াল পোর্টটিতে পরিচালনা করার চেয়ে বেশি বার লিখছেন।

বন্দর দ্রুত তথ্য লিখেছেন হিসাবে আপনি কনফিগার, এবং ডাটা বাফারের যে আপনার প্রোগ্রাম থেকে আসতেছে খুব দ্রুত , এটা যত তাড়াতাড়ি সম্ভব বের লিখতে। এটি বাফারে পূর্ণ, এটি কেবল নতুন ডেটা ফেলে দেয়।

এখানে গুরুত্বপূর্ণ যেটি এটি মানগুলির ক্রম বজায় রাখবে: এটি একটি ফিফো বাফার , ফার্স্ট ইন / ফার্স্ট আউট ক্রমে কাজ করছে।

যা ঘটে তা হ'ল:
লুপটি পোর্ট বাফারটি পূরণ করে এবং এটি 100% পূর্ণ রাখে।
আপনি যদি পেন্টিয়োমিটারটি চালু করেন, পরিবর্তিত মানটি বাফারের শেষের দিকে লেখা হয় , পোর্টটি বাফারের সমস্ত উপাদানগুলি লিখতে যত দ্রুত সম্ভব কাজ করে, এর পুরানো মান রয়েছে।

এবং অবশেষে আপনার আগ্রহী মানটি। আমরা অবিলম্বে দেখতে চাইলে সর্বাধিক বর্তমান মানটি ছিল ফিফোর শেষের দিকে এবং প্রথম / প্রথম আউটটি সর্বশেষে / শেষের অর্থ। আমরা যা চাই তার বিপরীত।

আপনার ডেটা পড়ার সর্বাধিক ফ্রিকোয়েন্সি হ'ল এটি যে ফ্রিকোয়েন্সিটি আপনি এটি লিখতে পারেন, তাই আপনার বর্তমান বন্দর গতিতে বাইটগুলি লেখার জন্য কমপক্ষে একটি বিলম্ব ব্যবহার করা উচিত।


অন্য হিসাবে, সাধারণভাবে এই জাতীয় বিলম্ব রোধ করার জন্য স্বাধীন ব্যবস্থা,
আপনি অতিরিক্তভাবে বন্দরটির লেখার বাফারকে ন্যূনতমতে সেট করতে পারেন।

এর ফলে প্রথমে প্রচুর পরিমাণে বাফারিংয়ের পরিবর্তে ডেটা অনেক আগেই ফেলে দেওয়া হবে।

অবশ্যই, অনেক অ্যাপ্লিকেশনগুলিতে আপনার যা প্রয়োজন তা নয়; দুর্ভাগ্যক্রমে, এটি প্রারম্ভিকভাবে যাইহোক কাজ করতে পারে এবং প্রসেসরের লোডের মতো বিষয়ের উপর ভিত্তি করে সময় পরিবর্তনের সময় কিছু পরিস্থিতিতে অস্থির হয়ে উঠতে পারে এবং কেবল কয়েকটি র্যান্ডম ডেটা নমুনাগুলি বাদ যায়। একটি বৃহত বাফার সাধারণত অনেক বেশি নির্জনবাদী আচরণ করে, তাই ডিফল্টরূপে একটি বৃহত বাফার ব্যবহার করবেন না ।


সঠিক ধারণা, তবে "এটি বাফার পূর্ণ, এটি কেবল নতুন ডেটা ফেলেছে" বিবৃতিতে পুরোপুরি সঠিক নয়। একবার বাফারটি পূর্ণ হয়ে গেলে ডেটা ফেলে দেওয়া হয় না, বরং বিদায়ী বাফারে স্থান না পাওয়া পর্যন্ত লেখকেরা ব্লক করে দেয়। এর অর্থ এই যে ইনপুট এবং আউটপুট শীঘ্রই একই গড় হারে প্রবাহিত হবে, তবে এর মধ্যে একটি বাফারের মূল্য রয়েছে ten
ক্রিস স্ট্রাটন

6

ক্রমাগত সিরিয়াল ডেটা প্রেরণের পরিবর্তে, কেবলমাত্র ডেটা প্রেরণ করুন যখন পেন্টিওমিওটারের মান একটি নির্দিষ্ট প্রান্তিকের পরিবর্তে পরিবর্তিত হয়।

int oldValue = 0;
const int threshold = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT)
}

void loop()
{
  if(oldValue >= analogRead(A0)+threshold || oldValue <= analogRead(A0)-threshold)
  {
    Serial.println(analogRead(A0));
    oldValue = analogRead(A0);
  }
}

1
এটি loop()সমান নমুনা দিয়ে আউটপুট বাফার পূরণ করছে না, এটি ভাল। তবে এটি এখনও প্রসেসরের পুরো গতিতে চলে, যা এটি প্রয়োজনের চেয়ে 100 গুণ দ্রুত হতে পারে। এর অর্থ এই যে ইনপুটটি ঘন ঘন পরিবর্তিত হয়, উদাহরণস্বরূপ উপরের গোলমাল থেকে thresholdবা উচ্চ রেজোলিউশনে ক্রমাগত পরিবর্তন (যা উদাহরণস্বরূপ অ্যাপ্লিকেশনটিতে এটি নয়)
ভোলকার সিগেল

0

দু'টি সহজ সমাধান যা এখনও খুঁজছেন তার জন্য কাজের গ্যারান্টিযুক্ত: -

  1. 50 থেকে 100 মিলিসেকেন্ডে বিলম্ব বাড়ান।

  2. পরে এই যোগ Serial.begin(9600)মধ্যে setup();

    Serial.setTimeout(50);

দ্বিতীয় ধাপটি সবচেয়ে গুরুত্বপূর্ণ। আমি উপরের কোডটি যুক্ত করার পরে এটিই আমার পক্ষে কাজ করেছিল। ঠিক অন্যান্য একই ফোরামে যখন আমি দেখেছিলাম এমন অনেক অন্যান্য ফোরামে এটি খুব প্রায়ই উল্লেখ করা হয় না।


এটি কিছুটা ভুল হয়ে গেছে। সেটটাইমআউট () পদ্ধতিটি ইনপুটটিতে প্রয়োগ হয়, আউটপুট নয় - ডকুমেন্টেশন দেখুন arduino.cc/en/Serial/SetTimeout
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.