بارکد | چیه و چطور ساخته میشه؟

داناترین مردم کسی است که دانش دیگران را به دانش خود بیفزاید - پیامبر(ص)

قبل از همه چیز، بهتره که از نظر لغوی این کلمه رو بررسی کنیم:

Bar + code = کد میله ای

تاریخچه

Bulls-eye barcode

فروشگاه ها کالا های زیادی داشتن و تهیه آمار و گزارش از محصولات موجود و فروخته شده، نیاز به نیروی کار انسانی داشت و زمان بر بود و البته که خطای انسانی هم وجود داشت. Norman J Woodland و Bernard Silver دو دانشجوی دانشگاه Dexel که از این موضوع خبر دار بودن، تصمیم گرفتن ی راه حلی برای این مشکل پیدا کنن.

اونا یک روش برای کدگذاری و یک دستگاه برای تشخیصش اختراع کردن، که ما بهش میگیم bulls-eye barcode ( یعنی بارکدی که مثل هدف تیراندازی میمونه )

عکس از https://99percentinvisible.org/episode/barcodes
عکس از https://99percentinvisible.org/episode/barcodes


حالا نحوه خوندن به این صورته که از خال وسط به سمت بیرون رو حرکت میکنیم، وقتی که اولین خط سفید رو دیدیم (خط 1) مختصات خط های بعدی رو هم میتونیم تشخیص بدیم ( یعنی محل خط 1 منعطفه ولی فاصله بقیه خط ها از خط 1 به صورت استاندارد هست ). اگر توی اون مختصات ها رنگ سیاه بود، یعنی 0، اگر سفید بود یعنی 1.

تصویر بالا 8 حالت مختلف سفید و سیاه بودن خط های 2و3و4 رو به تصویر میکشه
تصویر بالا 8 حالت مختلف سفید و سیاه بودن خط های 2و3و4 رو به تصویر میکشه


نحوه خوندن این عدد ها مثل عدد باینری هست که رقم سمت چپ بیشترین ارزش و رقم سمت راست کمترین ارزش رو داره.

برای مثال توی تصویر 3 (Fig 3) خط های 2 و 3 اش سفیده پس توی استاندارد 4 خطی، مقدارش میشه:

1x2² + 1×2¹ + 0×2⁰ = 6

به همین روش مقدار تصویر 4 میشه 5.

این روش حتی توی 1952 هم ثبت اختراع شد، اما به دلیل مشکلاتش ( اندازه بزرگی داشت و اینکه پرینتر های اون موقع انقد دقیق نبودن که مرز های این خط های ریز رو دقیق چاپ کنن ( البته شکل دایره اش هم بی تقصیر نبود )) هیچ وقت مورد استفاده عمومی قرار نگرفت.


KarTrak ACI (Automatic Car Identification)

گذشت تا حدود سال 1960 که انجمن راه های ریلی آمریکا به همراه چند تا شرکت، با توجه به مشکل سختی و زمان بر بودن رصد قطار های ورودی و خروجی و گم شدن بعضی از اونها!، تصمیم گرفتن برای این مشکل ی راه حل ارائه بدن.

نتیجه تلاششون یک استاندارد و یک دستگاه تشخیص اون استاندارد بود، اسمش رو گذاشتن KarTrak ( تغییر نوشتاری car track - یعنی رهگیری ماشین - منظور از car هم railcar هست، که یعنی ماشینی رو روی ریل حرکت میکنه ).

برای شناسایی شدن قطار، چند سطر کد رنگی ی طرف بدنه قطار میچسبودن. نزدیک ایستگاه های قطار هم ی دستگاه به اندازه یخچال کوچیک بود که با لامپ مخصوص نور میتابتوند و از بازتابش کد رو تشخیص میداد. این دستگاه میتونست تا فاصله 3.5 متری کد رو تشخیص بده. مزیت این روش هزینه نسبتا کم به ازای هر قطار و تشخیص قطار موقع حرکت بود. بعد ها بجای لامپ از لیزر برای تشخیص این کار استفاده کردن که هم سرعت و هم دقتش رو افزایش میداد.

عکس دو قطار که روشون این کد های karTrak چسبونده شده -  عکس سمت چپ توسط Rob Swatski از https://www.flickr.com/photos/rswatski/6934446670 عکس سمت راست توسط Quinn Rossi از  https://www.flickr.com/photos/theeskimo/4898894840
عکس دو قطار که روشون این کد های karTrak چسبونده شده - عکس سمت چپ توسط Rob Swatski از https://www.flickr.com/photos/rswatski/6934446670 عکس سمت راست توسط Quinn Rossi از https://www.flickr.com/photos/theeskimo/4898894840


خب این استاندارد 4 تا رنگ اصلی داره ( قرمز، آبی، سیاه، شطرنجی یا checker ) که باهاش 13 کاراکتر رو پشتیبانی میکنه،

این 13 تا کاراکتر که 11 تاشون واسه اعداد 0 تا 10 هستن، ی کاراکتر start و stop هم داره که مشخص بشه از کجا کد ها شروع میشه و تا کجا ادامه داره.

کاراکتر های استاندارد karTrak ا - http://www.nakina.net/other/aci/aci.html
کاراکتر های استاندارد karTrak ا - http://www.nakina.net/other/aci/aci.html


این سطر ها از پایین به بالا خونده میشن:

  • سطر 13 (بالاترین) : عدد چک
  • سطر 12: کاراکتر stop
  • سطر 6 تا 11: شماره قطار
  • سطر 2 تا 5: شماره صاحب قطار
  • سطر 1 (پایین ترین): کاراکتر start

توی این استاندارد یک سطر به عنوان عدد چک شناخته میشه. دستگاه با چک کردن این عدد میتونه متوجه بشه که بقیه رقم هارو درست تشخیص داده یا نه.

اگر عدد شماره سطر را با n و عدد توی خود سطر رو با dₙ نشون بدم، فرمولش به این شکل در میاد:

(∑¹¹ₙ₌₂ ( dₙ × 2ⁿ⁻² ))  ≡¹¹

که یعنی: باقی مانده تقسیم بر 11 جمع ( عدد هر سطر × 2^(شماره سطر - 2 ))

این روش بعد از استفاده 95 درصدی ایستگاه های ریلی آمریکا، بعد از 3 سال به دلیل بعضی از مشکلات، کلا کنار کذاشته شد:

  1. حدود 20% از کد ها درست شناسایی نمیشدن
  2. تغییرات آب و هوایی ( مثل برف، بارون، گرد و غبار ) که ممکن بود روی کد بشینن و مانع تشخیص بشن


Linear Barcode ( بارکد خطی )

آقای Woodland ( یکی از دو مخترع bulls-eye barcode که بالاتر بهش اشاره کردم) با درس گرفتن از ویژگی ها مثبت karTrak ( مثل استفاده از عدد چک و چیدمان خطی رنگ ها و نحوه تقسیم بندی عدد ها ) و اومدن اسکنر های لیزری و البته کمک های شرکت IBM، استاندارد جدیدی رو معرفی کرد به نام UPC که مخفف Universal Product Code هست.

اولین محصول با این استاندارد توی سال 1974 اسکن شد و بعد به سرعت فراگیر شد، به طوری که تا سال 1980 بیشتر فروشگاه ها ازش استفاده میکردن.

بارکد انواع مختلفی داره، اساس کارشون یکسانه. من توی این مقاله فقط UPC-A رو بررسی میکنم.


خب UPC ها 23 تا کاراکتر دارن، که 20 تا برای دو نوع عدد از 0 تا 9 است (7 قسمتی)، ی منطقه خالی قبل و بعد بارکد (حداقل 9 قسمتی)، ی نشونه برای ابتدا و انتهای کار (3 قسمتی) و یک نشونه وسط (5 قسمتی).

چند تا نکته در مورد کاراکتر های عددی:

  1. به دو نوع گروه Parity تقسیم میشن، odd Parity یعنی تعداد خونه های سیاه فرده، even parity یعنی تعداد خونه های سیاه زوجه
  2. همیشه تعداد گروه های سیاه و سفید پشت سر هم 2 تاست (دوتا گروه سفید و دوتا گروه سیاه)
  3. از نظر پر یا خالی بودن قسمت ها، الگوری even parity و odd parity دقیقا برعکس هم هستن
  4. توی Odd Parity قسمت اول همیشه سفید هست و توی Even Parity همیشه سیاه

الگوی ساخت یک کد UPC از نظر نوع کاراکتر های مورد استفاده اینطوریه:

QLOOOOOOMEEEEEERQ

که Q به معنی Quiet Zone، حرف L و R به معنی Left/Right Guard، حرف M به معنی Middle Guard، حرف E به معنی Even Parity و حرف O به معنی Odd Parity هست.( اعداد سمت چپ Odd parity هستن و اعداد سمت راست Even Parity ).

یکی از دلایل داشتن دو نوع عددی اینه که اگر بارکد رو برعکس به اسکنر دادیم، همچنان بتونه درست کد رو تشخیص بده. ( با توجه به تفاوت های ذکر شده چند خط بالاتر، انجام چنین کاری سخت نیست )

خب حالا از لحاظ معنی کاراکتر های UPC-A رو بررسی میکنیم:

http://www.barcodeart.com/science/science.html
http://www.barcodeart.com/science/science.html


کدهای UPC-A، ا 12 رقم هستن که 6 رقم اول برای شماره کارخونه است (رقم اولش نوع کارخونه رو مشخص میکنه، مثلا 3 یعنی شرکت داروسازی) و پنج رقم بعدی برای شماره محصول. رقم آخر هم عدد چک هست ( توی تصویر نوشته Modulo Check Character )، که از این فرمول بدست میاد:

  1. از راست ترین عدد ( عدد 11 ام ) شروع میکنی
  2. عدد ها رو یکی در میون در 3 ضرب میکنی
  3. بعد همه رو باهم جمع میکنی
  4. نزدیک ترین عدد مضرب 10 بزرگتر از جواب قسمت قبل رو از خودش کم میکنی


راستش فلسفه پشت این فرمول های محاسبه عدد چک مربوط به علوم رمزنگاری میشه، که من ازش خیلی اطلاع ندارم… ولی همینقدر بدونید که اگر خط های مربوط به یک رقم هم پاک شده باشه، بازم درست تشخیص میده!


مثال

حالا میخوایم بارکد عدد 31205983466 رو تولید کنیم. اول باید عدد چک اش رو حساب کنیم.

(3×3)+1+(2×3)+0+(5×3)+9+(8×3)+3+(4×3)+6+(6x3) =
9+1+6+0+15+9+24+3+12+6+18 = 83
90 - 83 = 7

بعد با توجه به الگوی UPC-A ، کاراکتر هارو جایگزین میکنیم. [حواستون باشه که که parity اعداد سمت چپ با راست فرق داره]


( خط اول الگوی UPC-A اورده شده و خط دوم عددی که داشتیم به همراه "عدد چک" اش. در نهایت هم قسمت های جدا رو بهم چسبوندم و با بارکد صحیح مقایسه اش کردم )

مراحل تولید بارکد UPC-A
مراحل تولید بارکد UPC-A

به همین سادگی ما تونستیم از عدد 11 رقمی، یک بارکد تولید کنیم! نتیجه اش هم با این سایت مقایسه کردم، همونطور که میبینید، هیچ فرقی نداره!

خب شاید واستون سوال باشه که چه کسی معنی این کد هارو مشخص میکنه؟ واقعیت اینه که شما میتونید این کد هارو تولید کنید و روی هر چیزی که میخواید بزنید ( مثلا فرودگاه ها میتونن روی چمدون های مسافر ها این کد هارو چاپ کنن)، اما اگر شما محصولی رو تولید کنید، برای اینکه همه فروشگاه ها بتونن با اسکن کردن بارکد شما اون رو شناسایی کنن، باید شرکت و دستگاهتون رو توی موسسه GS1 ثبت کنید ( توی ایران هم شعبه داره ). تعرفه هاش به ازای تعداد نوع های محصولات شما متفاوته.

ی استاندارد دیگه هم وجود داره و کوچیک تر از UPC-A هست به نام UPC-E که کلیت کارش همینه ولی خب الگو ها کلا فرق میکنه. اگر خواستید میتونید اینجا و اینجا در موردش بخونید.

یک نمونه بارکد UPC-E
یک نمونه بارکد UPC-E