আমি কীভাবে একটি PIC মাইক্রোকন্ট্রোলারের সাথে +2 ভি থেকে +2 ভি এনালগ সংকেত নমুনা করব?


10

300 Hz এর চেয়ে কম ফ্রিকোয়েন্সি সহ এনালগ সিগন্যাল থেকে রিডিং নিতে আমি 10 বিট এডিসি সহ একটি পিক মাইক্রো ব্যবহার করছি। তবে এনালগ সিগন্যালটি -2 ভি এবং +2 ভি এর মধ্যে রয়েছে it সিগন্যালটিকে ব্যবহারের যোগ্য সীমার মধ্যে আনার জন্য আমি কীভাবে শর্ত করতে পারি (এডিসিতে ইনপুটটি ইতিবাচক হতে হবে তা ধরে নিই) এছাড়াও আমার কাছে ইতিবাচকও নেই এবং নেতিবাচক শক্তি সরবরাহ।





@ কেলেনজবিবি - আপনি যে প্রশ্নগুলি সংযুক্ত করছেন এটি এই বিশেষ ক্ষেত্রে গণনার সমাধান করতে পারে না, যেখানে ইনপুট ভোল্টেজ রেলপথের বাইরে উভয় পথে যায়।
স্টিভেনভে

নিম্নলিখিত প্রশ্নগুলির এটির সদৃশ হিসাবে বন্ধ করা হয়েছিল এবং এর দরকারী উত্তর রয়েছে: ইলেক্ট্রনিক্স.সটাকেক্সচেঞ্জ / প্রশ্নগুলি /
15985/…

উত্তর:


14

গুরুত্বপূর্ণ দ্রষ্টব্য: -20 ভি থেকে + 20 ভি ইনপুটটির
সমস্যার সমাধান করার জন্য এই উত্তর পোস্ট করা হয়েছিল , কারণ এটিই বলা হয়েছিল। এটি একটি চতুর পদ্ধতি তবে যদি ইনপুট ভোল্টেজ সীমাটি রেলের মধ্যে থেকে যায় তবে কাজ করে না।

আপনাকে একটি রেজিস্টার ডিভাইডারের সাহায্যে ভোল্টেজটি স্কেল করতে হবে যাতে আপনি -2.5V এবং + 2.5V এর মধ্যে ভোল্টেজ পেতে পারেন এবং 2.5V যুক্ত করতে পারেন। (আমি আপনার পিকের জন্য একটি 5 ভি পাওয়ার সাপ্লাই অনুমান করছি)।

নিম্নলিখিত গণনা দীর্ঘ দেখায়, তবে কেবলমাত্র আমি প্রতিটি পদক্ষেপটি বিশদভাবে ব্যাখ্যা করার কারণে এটি। বাস্তবে এটি এত সহজ যে আপনি কোনও দিনই এটি আপনার মাথায় করতে পারবেন।

প্রথম এটি:

R1 মধ্যে রোধ হয় এবং ভী হে ইউ টি , R2 হলো মধ্যবর্তী রোধ হয় + + 5 ভী এবং ভী হে ইউ টি এবং R3 মধ্যে রোধ হয় ভী হে ইউ টি এবং জি এন ডিভীআমিএনভীহেইউটি
+ +5ভীভীহেইউটি
ভীহেইউটিজিএনডি

আমাদের কত অজানা আছে? তিন, আর 1, আর 2 এবং আর 3। একদম নয়, আমরা একটি মান অবাধে চয়ন করতে পারি এবং অন্য দুটি এটির উপর নির্ভরশীল। আসুন R3 = 1k নির্বাচন করুন। অন্যান্য মানগুলি খুঁজে পাওয়ার গাণিতিক উপায় হ'ল দুটি ( , ভি ইউ টি ) জোড়া থেকে দুটি যুগপত সমীকরণের একটি সেট তৈরি করা এবং অজানা প্রতিরোধকের মানগুলির সমাধান করা। যে কোনও ( ভি আই এন , ভি ইউ টি ) জোড়াগুলি করতে পারে তবে আমরা দেখতে পাব যে আমরা এই জোড়াগুলি সাবধানতার সাথে চূড়ান্ত মানগুলি বেছে নিয়ে জিনিসগুলিকে অত্যন্ত সহজ করতে পারি: ( + 20 ভি , + 5 ভি ) এবং ( -ভীআমিএনভীহেইউটিভীআমিএনভীহেইউটি+ +20ভী+ +5ভী , 0 ভি )। -20ভী0ভী

প্রথম কেস: , V O U T = + 5 V নোট করুন (এবং এটি সমাধানের মূল চাবিকাঠি!) আর 2 এর উভয় প্রান্তে + 5 ভি দেখুন , সুতরাং কোনও ভোল্টেজ ড্রপ নেই, এবং তাই নেই আর 2 এর মাধ্যমে বর্তমান এটার মানে হল যে আমি আর 1 গেছে হিসাবে একই হতে আমি আর 3 (KCL)। I R 3 = + 5 V - 0 Vভীআমিএন=+ +20ভীVOUT=+5V
+5VIR1IR3
। আমরা আর 1 এর মাধ্যমে কারেন্টটি এবং তার উপর ভোল্টেজটিও জানি, তাই আমরা এর প্রতিরোধের গণনা করতে পারি:আর1=+20ভি-5ভিIR3=+5V0V1kΩ=5mA=IR1
। আমাদের প্রথম অজানা পাওয়া গেল! R1=+20V5V5mA=3kΩ

দ্বিতীয় কেস: , ভি ইউ টি = 0 ভি আর 2 এর সাথে একই জিনিস এখন আর 3 এর সাথে ঘটে: ভোল্টেজ ড্রপ নেই, তাই কোনও বর্তমান নেই। আবার কেসিএল অনুসারে, এখন আমি আর 1 = আই আর 2আই আর 1 = - 20 ভি - 0 ভিভীআমিএন=-20ভীভীহেইউটি=0ভী
আমিআর1আমিআর2
। আমরাআর2 এরমাধ্যমে কারেন্টটি এবং তার উপর ভোল্টেজও জানি, তাই আমরা এর প্রতিরোধের গণনা করতে পারি:আর2=+5ভি-0ভিআমিআর1=-20ভী-0ভী3Ω=6,67মিএকজন=আমিআর2
। আমাদের দ্বিতীয় অজানা পাওয়া গেল! আর2=+ +5ভী-0ভী6,67মিএকজন=0.75Ω

সুতরাং একটি সমাধান পাওয়া যাবে: R1=3kΩ,R2=0.75kΩ,R3=1kΩ

আমি বলেন, এটি একমাত্র অনুপাত এই মান যা গুরুত্বপূর্ণ মধ্যে, তাই আমি ভাল হিসাবে বেছে নিতে পারে । আমরা এই সমাধানটি অন্য একটি ( ভি আই এন , ভি ইউ টি ) জোড়ার বিরুদ্ধে পরীক্ষা করতে পারি , যেমন ( 0 ভি , 2.5 )। আর 1 এবং আর 3 এখন সমান্তরাল (তাদের উভয়ই তাদের উপরে + 2.5V-0V রয়েছে, সুতরাং যখন আমরা তাদের সম্মিলিত মান গণনা করি তখন আমরা 0.75 খুঁজে পাইR1=12kΩ,R2=3kΩ,R3=4kΩ
VINVOUT0V2.5V , ঠিক R2 হলো মান এবং মান আমরা পেতে প্রয়োজন + + 2.5 ভী থেকে + + 5 ভী ! সুতরাং আমাদের সমাধান প্রকৃতপক্ষে সঠিক। [কিউসি স্ট্যাম্প এখানে যায়]0.75kΩ+2.5V+5V

শেষ কাজটি হ'ল পিকের এডিসিতে সংযুক্ত করা। এডিসিগুলিতে প্রায়শই কম ইনপুট প্রতিরোধ থাকে, তাই এটি আমাদের সাবধানে গণনা করা ভারসাম্যকে ব্যাহত করতে পারে। চিন্তার কিছু নেই, প্রায় যাইহোক, আমরা কেবল যাতে R3 বাড়াতে হবে আর 3 / / আর একটি ডি সি = 1 Ω । ধরা যাক আর ডি সি = 5 কে Ω , তারপরে 1VOUTR3//RADC=1kΩRADC=5kΩ এই থেকে আমরা খুঁজেআর3=1.25Ω11kΩ=1R3+1RADC=1R3+15kΩR3=1.25kΩ



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


-20 ভি এর ফলাফল 0V এর নীচে থেকে নীচে নেমে আসবে।
অলিন ল্যাথ্রপ

(এবং সম্ভবত অলিন ল্যাথ্রপ): আপনি কীভাবে 7 কে রেজিস্টারের মান খুঁজে পান তা জানার চেষ্টা করছিলাম। আমি লক্ষ্য করেছি যে যখন ইনপুট ভোল্টেজ 2.5V হয় তখন নোডের কাছে কারেন্ট প্রবাহিত হবে না, প্রতিরোধকের মান যাই হোক না কেন, কোনও ভোল্টেজের পার্থক্য নেই। কিন্তু যে 2.5V হয় না মধ্য পরিসীমা, যখন 2.5V আউট অত্যধিক। তার মানে কি এই নয় যে বিভাজকের দুটি পৃথক প্রতিরোধক থাকা উচিত? আপনি আমি বলতে চাচ্ছি তা জানেন.
ফেডেরিকো রুসো

সম্ভবত এটি @ অলিন ল্যাথ্রপের মন্তব্যও ব্যাখ্যা করে।
ফেডেরিকো রুসো

@ ফ্রেডেরিকো: হ্যাঁ, এটি সম্পূর্ণরূপে প্রতিসম নয় be আমি আমার উত্তরে এটি আলোচনা। তিনটি প্রতিরোধকের মানচিত্র -20 থেকে +20 ভোল্ট থেকে 0 থেকে 5 ভোল্টে সামঞ্জস্য করা সম্ভব তবে স্টিভেন এবং আমি উভয়ই সহজ ক্ষেত্রে দেখিয়েছি যেখানে আপনি লিটল অ্যাসিমেট্রি পাবেন।
অলিন ল্যাথ্রপ

6

সবচেয়ে সহজ উপায় "প্রতিরোধক ডিভাইডার" ব্যবহার করা।

আপনি এই কথাটি বলেননি যে এই পিআইসিটি কী ভোল্টেজ চলছে এবং সেজন্য এ / ডি ইনপুট পরিসরটি রয়েছে তাই উদাহরণস্বরূপ 5V ব্যবহার করা যাক। আপনার ইনপুট ভোল্টেজের পরিসীমা 40 ভি, এবং আউটপুট 5 ভি, সুতরাং আপনার কমপক্ষে 8 দ্বারা আচ্ছন্ন হওয়া এমন কিছু দরকার যা আপনার ফলাফলটি 1/2 ভিডিডিকে কেন্দ্র করে গড়ে তুলতে হবে, যা 2.5 ভি হয়, তবে আপনার ইনপুট ভোল্টেজ 0 ভি কেন্দ্রিক ।

এটি 3 প্রতিরোধকের দ্বারা সম্পন্ন করা যেতে পারে। তিনটি প্রতিরোধকের এক প্রান্ত একসাথে এবং পিআইসি এ / ডি ইনপুট পিনের সাথে সংযুক্ত রয়েছে। আর 1 এর অন্য প্রান্তটি ইনপুট সিগন্যালে যায়, আর 2 ভিডিডি যায় এবং আর 3 স্থলভাগে যায়। রেজিস্টার ডিভাইডারটি আর 1 এবং আর 2 এবং আর 3 এর সমান্তরাল সংমিশ্রণ দ্বারা গঠিত হয়। আপনি ফলাফলের পরিসীমা 2.5 ভিতে কেন্দ্রের জন্য আর 2 এবং আর 3 সামঞ্জস্য করতে পারেন, তবে সরলতার জন্য এটি ব্যাখ্যা করার জন্য আমরা কিছুটা অনুমানের সাথে বেঁচে থাকব এবং উভয় প্রান্তটি ভ্যাস-ভিডিডি সীমার মধ্যে সীমাবদ্ধ রয়েছে তা নিশ্চিত করার জন্য আমরা আরও কিছুটা আরও কমিয়ে আনব।

ধরা যাক পিআইসি এনালগ সিগন্যালটি 10 ​​কিলো বা তারও কম এর প্রতিবন্ধকতা চায়। আবার সরলতার জন্য, আসুন R2 এবং R3 20 kΩ তৈরি করুন Ω পিআইসিকে খাওয়ানো প্রতিবন্ধকতাগুলি তাদের সমান্তরাল সংমিশ্রণের চেয়ে বেশি হবে না, যা 10 kΩ Ω 8 এর মন্থরতা পেতে, আর 1 এর 7 বার আর 2 হওয়া উচিত / আর 3, যা 70 কিলোমিটার Ω তবে ফলাফল যেহেতু হুবহু প্রতিসাম্যহীন হবে না, তাই নিশ্চিত করতে আমাদের আরও কিছুটা কমিয়ে আনা দরকার -২০ ভি পিআইসি-তে 0 ভোল্টের কম হবে না। এটি আসলে 9 এর সূক্ষ্মতা প্রয়োজন, সুতরাং আর 1 কমপক্ষে 8 বার আর 2 / আর 3 হতে হবে যা 80 কিলোমিটার Ω 82 কিলোমিটারের মান মানটি কিছু opালু এবং মার্জিনের জন্য অনুমতি দেয় তবে আপনি এখনও মূল সংকেতটি পরিমাপ করতে বেশিরভাগ এ / ডি পরিসীমা পান।

যোগ করা হয়েছে:

এখানে একটি অনুরূপ সমস্যার সঠিক সমাধান সন্ধানের একটি উদাহরণ দেওয়া আছে। এটির কোন অনুমানকতা নেই এবং একটি নির্দিষ্ট নির্দিষ্ট আউটপুট প্রতিবন্ধকতা রয়েছে। A / D পরিসীমা সম্পূর্ণ ইনপুট ভোল্টেজের সীমার মধ্যে থাকলে সমাধানের এই ফর্মটি সর্বদা ব্যবহার করা যেতে পারে।


+1 কারণ যতগুলি অংশ গণনা যায়, এটি যা প্রয়োজন তা তৈরি করার সহজতম উপায়। কিছু নোট: ইউসির কোডে অ্যাসিমেট্রিটির যত্ন নেওয়া সম্ভব এবং জিএনডি-তে যে রেজিস্টারের সাথে সমান্তরালভাবে একটি ক্যাপাসিটার যুক্ত করে সিগন্যালটি সহজেই আনা যায় (লো-পাস ফিল্টার)। কোণে freq। 1 / (2 * পাই আর সি), যেখানে আর সব তিনটি প্রতিরোধকের সমান্তরাল মান এবং C টুপি যে যোগ করা হয় এর মান (এডিসি যাহাই হউক না কেন টুপি প্রয়োজন।!) হয়। সমস্ত সহনশীলতা বিবেচনা করে এই সেটআপটির যথার্থতা গণনা করুন (আর, এডিসি ত্রুটি +/- সর্বাধিক এলএসবি, রেফারি ত্রুটি, ...) - এটি প্রত্যাশার চেয়েও খারাপ হতে পারে।
zebonaut

@ জেবোনাট - আমি পুনরায় হিসাব করেছিলাম এবং আমার আপডেট হওয়া উত্তরে প্রতিটি পদক্ষেপের বিস্তারিত ব্যাখ্যা করেছি (এটি দেখতে কম জটিল বলে মনে হচ্ছে!)। এটি আপনাকে (-20 ভি .. + 20 ভি) থেকে (0 ভি .. + 5 ভি) এর সঠিক ম্যাপিং দেয়
স্টিভেনভ

@ জেবোনাট: ক্যাপাসিটারটি অ্যান্টি-এলিয়জিং ফিল্টার হিসাবে কার্যকর হতে পারে তবে এটি অনুমান সম্পর্কে কিছুই করে না। আমি মনে করি না যে ছোট অ্যাসিমেট্রিটি একটি বড় ব্যাপার। আপনি যেমন বলেছিলেন তেমন ফার্মওয়্যারের যত্ন নেওয়া যথেষ্ট সহজ।
অলিন ল্যাথ্রপ

আপনি যদি সফ্টওয়্যারটিতে অসম্পূর্ণতা ক্ষতিপূরণ দিতে চান তবে আপনাকে সঠিক স্থানান্তর কার্য গণনা করতে হবে। যদি আপনাকে যাইহোক এটি করতে হয় তবে কেন প্রথমে সঠিক প্রতিরোধকের মানগুলি ব্যবহার করবেন না (আমার প্রথম (ভ্রান্ত) উত্তর থেকে নয়!)
স্টিভেনভ

@ স্টেভেনভ: "ডান" প্রতিরোধকের মানগুলি ব্যবহার করে কোনও ভুল নেই। আমি বুঝতে পেরেছিলাম যে একটি সঠিক ম্যাপিং সম্ভব (যেমন আমি আমার উত্তরে উল্লেখ করেছি), তবে গণনার জটিলতায় না নেওয়ার এবং ধারণাটি সহজতর জবাব দেওয়ার সিদ্ধান্ত নিয়েছি যা ফলাফলটি সামান্য অনুমানের ফলস্বরূপ। যাই হোক না কেন, আপনাকে opালু হিসাব করতে আরও কিছুটা কমাতে হবে, এবং সম্ভবত ফার্মওয়্যারটিতে ক্যালিব্রেট করা উচিত।
অলিন ল্যাথ্রপ

2

এটি এটির জন্য স্ট্যান্ডার্ড সার্কিট। আপনার প্রয়োজনীয় প্রতিবন্ধকতার জন্য আপনাকে প্রতিরোধকের মানগুলি স্কেল করতে হবে।


আপনার উত্স প্রতিবন্ধকতা অপেক্ষাকৃত কম ব্যবহার করে তা নিশ্চিত করার দরকার কি?
নিক টি

লিওন, কেন 1 কে রেজিস্টারের পরিবর্তে ক্যাপাসিটার ব্যবহার করবেন না?
স্টিভেনভ

এটি একটি ডিসি-কাপলড সমাধান। সঠিক ক্রিয়াকলাপের জন্য সিরিজ প্রতিরোধকের প্রয়োজন।
লিওন হেলার

3
@ লিওন হেলার: আমি মনে করি যে আপনি যদি প্রতিরোধকদের জন্য সঠিক মানগুলি কীভাবে সন্ধান করতে পারেন তা ব্যাখ্যা করলে এটি আরও ভাল উত্তর হতে পারে।
ফেদেরিকো রুসো

2

যদি সিগন্যালটি ডিসি না হয়, বা কোনও ডিসি রেফারেন্স গুরুত্বপূর্ণ না হয় তবে সংকেতটি এডিসির ইনপুটটিতে ক্যাপাসিটিভ জোড় করে তৈরি করা যেতে পারে।

বিকল্পভাবে, যদি আপনার পিসিকের ভিত্তি ভাসমান হয়, আপনি আপনার সিগন্যাল স্থলটিকে পিকের 1/2 ভিডিডি বেঁধে রাখতে পারেন।


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

সরবরাহের ভোল্টেজ নির্দিষ্ট করা হয়নি - এটি একটি 5 ভি এডিসির সাথে কাজ করবে। আপনি যদি একটি ছোট ভিডিডি ব্যবহার করে থাকেন তবে আপনার ইনপুটটি স্কেল করতে হবে। এটি সেই সময়ে ক্যাপাসিটরের সাথে লিওনের সার্কিটে পরিণত হবে।
W5VO

2

নিম্নলিখিত সার্কিটটি কাজটি করা উচিত:

3.3V
 +
 |
 \
 / 1k
 \
 |
 +-- ADC input
 |
 \
 /  1k
 \
 |
 +-- Signal input (-2V to +2V)

এটি একটি সম্ভাব্য বিভাজক। -2 ভি তে, আউটপুট 0.65V হবে; + 2 ভি, 2.65V এ।

3.3 ভি রেলের সমস্ত শব্দ ইনপুটটিতে স্থানান্তরিত হবে, সুতরাং এই সমস্যাটি হ্রাস করতে একটি ভাল ভোল্টেজ রেফারেন্স ব্যবহার করুন।

এটি অন্যান্য সরবরাহগুলির সাথেও কাজ করবে, তবে অফসেটটি স্থানান্তরিত হবে।


হ্যাঁ, এটি কাজ করে তবে পুরো ADC ব্যাপ্তিটি ব্যবহার করা ভাল হবে :-)
স্টিভেন্ভ

@ স্টেভেনহ আপনি 0.65V এবং 2.65V রেফারেন্স ব্যবহার করে এটি করতে পারেন যদিও আপনি তখন নিজের সার্কিটটি ব্যবহার করতে পারেন।
থমাস ও

আফাইক ছবিগুলি কেবল একটি ভীআরএফ+ + ইনপুট, আপনি সেট করতে পারবেন না ভীআরএফ-। বেশিরভাগ নিয়ন্ত্রকের মতো এটি সর্বদা সংযুক্ত থাকেজিএনডি
স্টিভেন্ভ

@ স্টেভেন পিআইসি 24, ডিএসপিক এবং পিআইসি 32-তে অবশ্যই ভেরেফ- রয়েছে। আমি মনে করি কিছু 18 এফও করে।
থমাস ও

হ্যাঁ, ঠিক আছে, আমি তাদের সব জানি না (আছে অনেক তাদের)। ওপি কোনও অংশটি ব্যবহার করছে না এবং সে নিখোঁজ বলে মনে হচ্ছে, তাই তাকে জিজ্ঞাসা করার কোনও লাভ নেই।
stevenvh

1

দু'টি অভিন্ন প্রতিরোধকের সাথে থমাসের ভোল্টেজ অ্যাডায়ারটি সত্যই সহজ, তবে এটির অসুবিধাও রয়েছে যে এডিসিতে ইনপুট পরিসর হ্রাস পেয়েছে, যার অর্থ শব্দটি আরও বেশি প্রভাব ফেলবে। এছাড়াও নিম্ন সীমা 0.65V এ রয়েছে। যদি আপনার মাইক্রোকন্ট্রোলারের একটি না থাকেভীএকজনডিসিআরএফ-ইনপুট (বেশিরভাগ নিয়ামকরা তা করেন না) ইনপুট পরিসরের অংশটি অব্যবহৃত থাকবে।
এটি ঠিক করা সহজ: প্রতিরোধকের অনুপাতটি নির্বাচন করুন যাতে এটিভীএকজনডিসিইনপুট -2 ভি হলে 0 ভি হবে। একটি জন্যভীডিডি5 ভি এর অর্থ ইনপুট রেজিস্টারটি পুল-আপ রোধকের 2/5 হওয়া উচিত। 2 ভি ইনপুট এভীএকজনডিসি2.86V হবে। সেটভীএকজনডিসিআরএফ+ + এই স্তরে, এবং -2 ভি থেকে + 2 ভি সম্পূর্ণ এডিসি পরিসীমা কভার করবে।

যদি তোমার ভীডিডি = 3.3V ইনপুট রোধকটি 61% হওয়া উচিত (2ভী3.3ভী) টান আপ। ইন + 2 ভি ইনভীএকজনডিসি 2.49V হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.