การอ่านลูกบอลบิงโกพร้อมไมโครคอนโทรลเลอร์

October 2, 2022 0 By cngf

ทุกครั้งในขณะที่โครงการมาพร้อมกับพลังเวทย์มนตร์ที่กินเวลาและความสนใจของคุณในหลายเดือน เมื่อในที่สุดคุณก็สมบูรณ์คุณรู้สึกเสียใจที่คุณไม่ต้องทำอะไรอีกต่อไป

อะไรเป็นพิเศษเกี่ยวกับเครื่องอ่านลูกบอลบิงโกนี้? มันอาจดูเหมือนโครงการ OCR ธรรมดาในการมองครั้งแรก กล้องวิดีโอจับภาพรูปภาพและซอฟต์แวร์ OCR จดจำหมายเลข ง่ายเท่าที่ และใช้งานได้โดยไม่มีปัญหาเช่นเดียวกับอุปกรณ์ที่ง่ายทุกอย่างควร

แต่จากนั้นอีกครั้งอาจไม่ใช่เรื่องง่าย ตัวเลขกระจัดกระจายไปทั่วลูกดังนั้นพวกเขาจะต้องตั้งอยู่ก่อนและควรเลือกผู้สมัครที่ดีที่สุดสำหรับการอ่าน จากนั้นตัวเลขจะถูกทาสีลงบนทรงกลมแทนที่จะเป็นพื้นผิวเรียบในบางกรณีทำให้พวกเขาเปลี่ยนรูปไปยังจุดที่รูปร่างของพวกเขาจะต้องกู้คืนก่อน นอกจากนี้มุมมองการอ่านไม่ได้รับการแก้ไข แต่บางแห่งในระดับ 360 ° จากนั้นเรามีปัญหาแสงจ้าในการบูตเนื่องจากลูกบอลบิงโกเป็นประกายเงางามที่แหล่งกำเนิดแสงทุกแหล่งสะท้อนเป็นจุดสว่างอิ่มตัว

นั่นคือทั้งหมดนี้หรือไม่ เกือบ งานที่คาดว่าจะดำเนินการโดยไมโครคอนโทรลเลอร์ที่ฝังตัวด้วยความเร็วและหน่วยความจำที่ จำกัด แต่กระบวนการจดจำสำหรับลูกบอลหนึ่งลูกจะต้องรวดเร็ว – 500 มิลลิวินาทีที่เลวร้ายที่สุด แต่นั่นเป็นเพียงส่วนหนึ่งของกระบวนการ โครงการนี้มีกลไกการบินที่ยอมรับลูกบอลการขนส่งที่จะถูกสแกนโดย OCR แล้วยิงกล้องวิดีโอเผยแพร่สาธารณะก่อนที่จะถูกทิ้ง และในที่สุดหากการอ่านไม่น่าเชื่อถือมากพอลูกจะต้องหมุนอย่างละเอียดเพื่อให้ตัวเลขที่จะเปลี่ยนตำแหน่งเพื่อพยายามอ่านอีกครั้ง

แม้จะมีความท้าทายเหล่านี้ที่ฉันจัดการเพื่อสร้างระบบนี้ มันรวดเร็วและเชื่อถือได้และฉันค้นพบเทคนิคที่น่าสนใจบางอย่างระหว่างทาง ลองดูที่วิดีโอสาธิตด่วนด้านล่างเพื่อรับความรู้สึกถึงความเร็วและสิ่งที่ระบบ “เห็น” จากนั้นเข้าร่วมกับฉันหลังจากหยุดดำน้ำในรายละเอียดของงานสร้างแบบฝังที่น่าสนใจนี้

ในขั้นต้นฉันคิดว่าฉันจะต้องใช้เครือข่ายประสาทเทียมสำหรับกระบวนการรับรู้ แต่มันกลับกลายเป็นว่าการรับรู้เป็นส่วนที่ง่ายที่สุดของโครงการและมันจะง่ายกว่ามากและเร็วขึ้นเพื่อทำอัลกอริทึม ส่วนที่ยากลำบากคือการระบุว่าอะไรคือสิ่งที่เกี่ยวกับภาพทั้งหมดค้นหาจำนวนที่ดีที่สุดบรรทัดภายใต้มันและการวัดปริมาณที่ควรจะหมุนได้ เริ่มต้นโดยไม่มีอะไรมากกว่าภาพบิตแมปโปรเซสเซอร์จะต้องทำคณิตศาสตร์จำนวนมากแม้กระทั่งก่อนที่จะตรวจสอบให้แน่ใจว่าตัวเลขประกอบด้วยตัวเลขหนึ่งหรือสองหลัก

แผนผังที่ง่ายขึ้นของส่วน OCR
VGA ในระหว่างการพัฒนา

เพื่อให้การพัฒนาการบำรุงรักษาและการปรับเปลี่ยนง่ายขึ้น MCU เดียวกันใช้สำหรับการสร้างสัญญาณ VGA นอกเหนือจากการดึงภาพและการประมวลผล มันไม่เพียง แต่แสดงภาพที่สแกนเท่านั้น แต่ยังรวมถึงพารามิเตอร์ปัจจุบันและเนื้อหา RAM คณะกรรมการควบคุมมีขั้วต่อ VGA แต่ไม่ควรใช้ในระหว่างการทำงานปกติของเครื่อง VGA Monitor ไม่มีอะไรที่เหมือนกันกับจอภาพออกอากาศใน Bingo Hall เนื่องจากมีกล้องอิสระและระบบแสงสว่างสองตัว

การสร้างสัญญาณ VGA ใช้เวลาในตัวประมวลผลจำนวนมากดังนั้นจึงปิดในระหว่างการดึงภาพและการประมวลผลซึ่งเป็นประมาณ 500 มิลลิวินาทีในแต่ละรอบการอ่านลูก สัญญาณซิงค์นั้นสร้างขึ้นอย่างโปร่งใสโดยอุปกรณ์ต่อพ่วงภายใน PWM ภายในและมีการใช้งานตลอดเวลาเพื่อให้การคืนค่ารูปภาพหลังจากการสร้างสัญญาณ RGB นั้นรวดเร็ว

ในกรณีนี้ไมโครคอนโทรลเลอร์ 16 บิต PIC24EP512GP806 ใช้กับ 586/52 K ของหน่วยความจำโปรแกรม / ข้อมูลและความเร็วในการดำเนินการ 60 mips

ดึงภาพ

กล้องวิดีโอ “Cube” ที่ไม่แพงใช้ในช่วงแรกของการพัฒนา แต่ถูกแทนที่ด้วยกล้องดิจิตอล Cube ทั้งสองมีราคาและประสิทธิภาพที่คล้ายกัน แต่อันหลังมาพร้อมกับเลนส์ที่มีความยาวโฟกัสที่สูงขึ้นดังนั้นระยะทางอาจสูงขึ้นและกล้องวิดีโอสามารถมองเห็นพื้นที่ขนาดใหญ่ของลูกบอล

สำหรับวัตถุขนาดเล็กดังกล่าวแหล่งกำเนิดแสงที่ดีที่สุดควรเป็นไฟ LED สีขาว แต่แสงจ้าค่อนข้างแย่กับพื้นผิวลูกเงา ฉันทำการทดลองกับ diffusers แต่ไม่มีโชค บริการในที่สุดมาจากแนวทางที่แตกต่างกัน: การสะท้อนที่สดใสและคมชัดมาก แต่มีการเปิดรับแสงสองครั้งซึ่งใช้แหล่งกำเนิดแสงที่แตกต่างกัน ในระหว่างกระบวนการดึงภาพที่สอง MCU เลือกค่าที่ต่ำกว่าสำหรับทุกพิกเซล

ในขณะที่ฮอตสปอตไม่เคยจับคู่พวกเขาจะถูกยกเลิกและภาพที่เป็นผลลัพธ์ (ภาพถ่ายที่สามจากซ้าย) มีแสงสว่างและปราศจากแสงจ้าอย่างสม่ำเสมอ ในฐานะที่เป็นโบนัสเพิ่มเติมสะท้อนแสงพื้นหลังถูกยกเลิกในกระบวนการเช่นกัน

โปรดทราบว่าระบบถูกฝังอยู่โดยไม่มีฟังก์ชั่นหน้าจอดังนั้นภาพมาจากจอภาพ VGA ที่ถูกถ่ายด้วยกล้อง

แหล่งกำเนิดแสงประกอบด้วย LED สีขาว 16 LEDs เพื่อให้ไฟ LED แปดดวงใช้งานอยู่ในแต่ละครั้ง ภาพที่ด้านขวามือขวาหมายถึงการจัดเรียง LED จากมุมมองของกล้อง ไฟ LED มีสีแดงและน้ำเงินที่นี่เพื่อช่วยแยกความแตกต่างระหว่างกลุ่มสำหรับการเปิดรับที่หนึ่งและครั้งที่สอง

สิ่งนี้ทำให้กระบวนการช้าลงอย่างมีนัยสำคัญเช่นเดียวกับตอนนี้เราไม่เพียง แต่มีการสัมผัสเพียงสองครั้งเท่านั้น แต่ยังรวมถึงเวลาเฟรมจำลองระหว่างสองแสงเพื่อให้การกู้คืนและที่พักของเซ็นเซอร์ CMOS หลังจากการเปลี่ยนแปลงแสงสว่าง นั่นเป็นเหตุผลที่กระบวนการถ่ายภาพทั้งหมดใช้เวลา 100 มิลลิวินาที

ความละเอียดของภาพที่สแกนคือ 220 × 220 พิกเซลที่มีความลึกพิกเซล 8 บิต ภาพอนาล็อกสีเทาประกอบด้วยเพียงหกบิตโดยมีสองบิตที่เหลืออยู่สำหรับการแสดงสีสีน้ำเงินและสีแดงบนจอภาพเนื่องจากสีเทาเป็นจริง ๆ แล้ว Greenscale พิกเซลพิเศษเหล่านั้นใช้เป็นพิกเซลธงพิเศษระหว่างขั้นตอนการประมวลผลมองเห็นได้ในโหมดขั้นตอนเดียวเป็นพื้นที่สีน้ำเงินและสีแดง [กลายเป็น] เป็นประโยชน์มากในระหว่างการพัฒนาโปรแกรมและการดีบัก

กระบวนการทั้งหมดแบ่งออกเป็น 17 ขั้นตอนซึ่งสามารถดำเนินการในโหมดขั้นตอนเดียวเพื่อการพัฒนาและการดีบัก หมายเลขขั้นตอนจะปรากฏขึ้นที่มุมซ้ายบนของหน้าจอ (ดูด้านล่าง) และสถานะปัจจุบันของนาฬิกาจับเวลาที่มีความละเอียด 1 MS ที่ด้านบนขวา วิธีนี้เป็นเรื่องง่ายที่จะทำตามเวลาดำเนินการและเพิ่มประสิทธิภาพแต่ละขั้นตอน

สถานที่ตั้งบอลและยืด

ในการค้นหาลูกบอลอย่างแม่นยำ, X, Y พิกัดสำหรับ Centroid (ศูนย์เรขาคณิต) คำนวณโดยใช้สูตร cx = σcixai / σaiและ cy = σciyai / σaiที่ cx, cy คือ x, y พิกัดและ a คือ ค่าของทุกพิกเซล เมื่อพื้นหลังเป็นสีดำส่วนใหญ่ก่อนขั้นตอนนี้ CX, CY จะอยู่ตรงกลางของลูกบอล จากนั้นบัฟเฟอร์เฟรมทั้งหมดจะถูกย้ายเป็นบล็อก 2D เพื่อให้เซนทรอยด์อยู่ที่พิกัด x = 110, y = 110 ซึ่งอยู่ที่กึ่งกลางของเฟรม ศูนย์มีการทำเครื่องหมายด้วยพิกเซลสีแดง 2 × 2 (บิต 7) สำหรับความสะดวกสบายของนักพัฒนาเท่านั้นเนื่องจากเฟิร์มแวร์แปรรูปในหลาย ๆ กรณีละเว้นบิต 6 และ 7

ถัดไปวัดเส้นผ่าศูนย์กลางของลูกบอลคำนวณค่าพิกเซลเฉลี่ยบนปริมณฑลสำหรับเส้นผ่านศูนย์กลางที่แตกต่างกัน จากนั้นพื้นหลัง (ทุกพิกเซลที่อยู่นอกเส้นผ่านศูนย์กลาง) ถูกตั้งค่าเป็น “สีขาว” หรือเฉพาะเจาะจงมากขึ้นสีเขียว (ค่า 0x3F) เพื่อรับประกันการแยกพื้นที่สีดำที่ดีขึ้น พื้นหลังจะถูกตั้งค่าเป็นสีขาวหรือสีดำอีกสองสามเท่าในระหว่างการประมวลผลทุกครั้งที่ต้องการการเลือกพื้นที่สีดำ (หมึก) หรือสีขาว (กระดาษ)

การเปลี่ยนทรงกลมให้ไร้ที่ติให้กับพื้นผิวที่เรียบเป็นไปไม่ได้ แต่รูปร่างสามารถปรับปรุงได้หากภาพไม่เปลี่ยนรูปแบบเชิงเส้นเช่นบนอิมเมจขั้นตอนที่ 3 ไมโครคอนโทรลเลอร์ขนาดเล็กขนาดเล็ก 16 บิตไม่มีตัวประมวลผลร่วมเลขคณิตและการใช้ไลบรารีตรีโกณมิติมาตรฐานจะใช้เวลาโปรเซสเซอร์มากเกินไป นั่นเป็นเหตุผลที่ใช้ตารางการค้นหาตรีโกณมิติและคุณสามารถดูบนนาฬิกาจับเวลา (ตัวเลขสีน้ำเงินที่ดีที่สุด) ที่ในกรณีนี้เวลาการดำเนินการสำหรับขั้นตอนการยืดเป็นเพียง 11 ms นอกจากนี้คุณยังสามารถเห็นได้ว่าส่วนกลางของลูกบอลส่วนใหญ่ไม่เปลี่ยนแปลงและขอบไม่ยืดเป็นเชิงเส้นเพื่อให้การเปลี่ยนรูปทรงกลมลดลง

ในขั้นตอนที่ 4 คล้ายกับฟังก์ชั่นหน้ากาก Unsharp ใน Photoshop ภาพใหม่ที่เบลอถูกสร้างขึ้น เนื่องจากมีพื้นที่ RAM ไม่เพียงพอสำหรับบัฟเฟอร์ Full Full Full Full จะดำเนินการในภาพเสริมซึ่งปรับขนาดลงสู่ความละเอียด 44 × 44 ฟังก์ชั่นของหน้ากาก Unsharp มีความสำคัญมากเนื่องจากการตรวจสอบการเลือกพิกเซล “หมึก” ที่ดีขึ้นเมื่อเทียบกับพิกเซล “กระดาษ” การเลือกหมายถึง “การตั้งค่าบิต 7” ซึ่งจะส่งผลให้พื้นที่สีแดงบนหน้าจอ VGA

ตอนนี้มีสองภาพในบัฟเฟอร์เฟรมเดียวกัน, สีเทาหนึ่ง (บิต 0-5) และไบนารีหนึ่ง (บิต 7) หลังใช้ในขั้นตอนการประมวลผลล่วงหน้าที่ 6 ซึ่งรูเล็ก ๆ และรอยขีดข่วนถูกกำจัด ภาพที่เลือกจะถูกขยายและหดตัวครั้งแรกจากนั้นกระบวนการจะทำซ้ำด้วยการซื้อการดำเนินการย้อนกลับ – ซึ่งส่งผลให้ขอบที่ถูกปัดเศษและปราศจากขยะอย่างราบรื่น

การจัดการส่วนประกอบ

หลังจากสองสามขั้นตอนการประมวลผลล่วงหน้ามากขึ้นการดำเนินการที่สำคัญมากขึ้นเกิดขึ้น คนแรกเรียกว่า “คอมโพเนนต์ที่เชื่อมต่อ” ซึ่งมีการเลือกพื้นที่แยกต่างหากและพารามิเตอร์สำหรับแต่ละรายจะได้มา ซึ่งรวมถึงมิติ X และ Y, พิกัด X และ Y Center จำนวนพิกเซลที่เลือกและระยะทางของ Euclid จากศูนย์กลางของเฟรม สิ่งนี้จะช่วยจัดเรียงองค์ประกอบทุกชิ้นเป็นหลักวงกลมขนาดใหญ่ขีดเส้นใต้หรือพื้นหลัง ในขั้นตอนนี้ก็ชัดเจนหากตัวเลขมีตัวเลขหนึ่งหรือสองหลัก

ขั้นตอนนี้ใช้เวลาในการประมวลผลจำนวนมากประมาณ 200 ms ปัญหาอีกประการหนึ่งคืออัลกอริทึมมาตรฐานสำหรับส่วนประกอบที่เชื่อมต่อนั้นต้องใช้บัฟเฟอร์เฟรมเสริมที่มีขนาดเท่ากันดังนั้นฉันจึงต้องสร้างอัลกอริทึมใหม่ซึ่งใช้บัฟเฟอร์เฟรมเดียวกันรวมถึงตารางเล็ก ๆ สำหรับพิกัดระยะสั้น

ณ จุดนี้มันเป็นเรื่องง่ายสำหรับโปรเซสเซอร์ในการเลือกผู้สมัครที่ดีที่สุดสำหรับการรับรู้ – เป็นวงกลมที่มีระยะห่างของ Euclid ที่เล็กที่สุดจากศูนย์กลางของลูกบอล ส่วนประกอบที่เชื่อมต่อภายในวงกลมนี้นำมาพิจารณาและทุกอย่างอื่นจะถูกลบออก

ลูกที่มีปัญหาเป็นลูก OCR พิเศษที่มีตัวเลขขีดเส้นใต้o ที่มุมของการหมุนสามารถวัดได้ ตอนนี้ศูนย์กลางของวงกลมเป็นที่รู้จักแล้วโปรแกรมจะหมุนฟอร์ม “T” เสมือนจริงซึ่งสอดคล้องกับรูปร่างขีดเส้นใต้ใน 512 ขั้นตอนรอบวงกลม 360 °นับจำนวนพิกเซล “หมึก” จำนวนมากที่มี การนับคะแนนสูงสุดกำหนดมุมของการหมุนจากนั้นบล็อก 2D ของเฟรมบัฟเฟอร์จะถูกย้ายไปที่มุมที่ดีที่สุดของภาพ (ขั้นตอนที่ 12 ในภาพซ้ายสุด) และการหมุนจะดำเนินการย้ายบิตแมปไปที่มุมตรงข้าม ของบัฟเฟอร์เฟรม ด้วยตารางการค้นหาลอการิทึมการดำเนินงานกลุ่มนี้ใช้เวลาเพียง 50 MS

มันทำให้ดีขึ้นทุกขั้นตอน ตัวเลขถูกเลือกด้วยสีที่แตกต่างกันแล้วหนึ่งหลักจะถูกย้ายไปยังระยะห่างที่ปลอดภัยแล้วแต่ละหลักจะถูกปรับขนาดให้กับความละเอียดที่ทราบ 30 × 46

การยอมรับ

เนื่องจากผู้อ่านนี้เป็นโครงการ OCR ครั้งแรกของฉันฉันคิดว่ากระบวนการจดจำจะเป็นส่วนที่ยากที่สุดในการแก้ปัญหา หลังจากแต่ละขั้นตอนนั้นดีบั๊กและตรวจสอบทีละขั้นตอนที่ 17 และขั้นตอนสุดท้าย ตามที่ฉันได้ชี้ไปแล้วแผนการเริ่มต้นของฉันคือการเลือกใช้เครือข่ายประสาท แต่แล้วฉันก็ลองอัลกอริทึมที่ง่ายและเล่นกับมัน ฉันประเมินมันด้วยลูกบอลสองสามลูกและคุณไม่สามารถจินตนาการได้ว่าฉันตกใจเมื่อฉันเห็นมันทำงานได้อย่างสมบูรณ์แบบ! ในที่สุดบิตแมปจะแสดงผลอย่างถูกต้องเป็นสองหมายเลข ASCII

อัลกอริทึมค่อนข้างง่าย บิตแมปสำหรับแต่ละหลักนั้นแบ่งออกเป็นสามส่วนในแนวนอนเป็นครั้งแรกแล้วในแนวตั้ง จากนั้นพิกเซลที่ใช้งานจะถูกนับในทุกคอลัมน์หรือแถวและฮิสโตแกรมที่สร้างขึ้น นอกจากนี้ยังมีฮิสโตแกรมที่ 7 ที่เพิ่มเข้ามาซึ่งเอียงเพื่อช่วยให้การตรวจจับเส้น crosscut ที่ตัวเลข 4 และ 7

มันใช้เวลาเพียง 3 ms ในการสร้างฮิสโตแกรมเจ็ดหลักสำหรับแต่ละหลักและเพื่อเปรียบเทียบกับตารางที่กำหนดไว้ล่วงหน้าคำนวณผลรวมของข้อผิดพลาดที่มีนัยสำคัญและเรียงลำดับผลลัพธ์ เพื่อให้การพัฒนาและการดีบักง่ายขึ้นฮิสโตแกรมทั้งหมดจะถูกพล็อตต่อหน้าจอ

หลังจากผลลัพธ์ของการเปรียบเทียบจะถูกจัดเรียงเราจะได้รับผู้ชนะสำหรับแต่ละหลัก (ในกรณีนี้ 8 และ 5) แต่งานของเรายังไม่เสร็จสิ้นจนกว่าจะมีสิ่งอื่นอีกมากมาย คุณภาพของการอ่านจะต้องได้รับการจัดอันดับเพื่อให้คอนโทรลเลอร์สามารถประเมินได้หากผลลัพธ์มีความน่าเชื่อถือเพียงพอ

หากหมายเลขบนลูกมีเพียงหนึ่งหลักตารางของข้อผิดพลาดสำหรับแต่ละหลัก (0 … 9) เรียงลำดับและ “ผู้ชนะ” ถูกเปรียบเทียบกับคนที่สอง (เกือบ – ผู้ชนะ) หากอัตราส่วนสูงนั่นหมายความว่าการรับรู้สำเร็จ ในกรณีของเรามันเป็น 147% ซึ่งหมายความว่าผู้สมัครที่ได้รับคะแนนที่สองมีข้อผิดพลาดมากกว่า 147% มากกว่าที่ดีที่สุด ตัวอย่างเช่นหนึ่งหน่วยแรกมีหน่วยข้อผิดพลาด 100 “และคนที่สองมี 247 นี่คือการให้คะแนนที่ดีแม้ว่าการให้คะแนนหลายอย่างอยู่ทางเหนือของ 300% โดยทั่วไปการให้คะแนนสูงกว่า 80% ควรได้รับการพิจารณาอย่างปลอดภัยเพียงพอ

แต่ถ้ามีตัวเลขสองหลัก โซ่มีความเข้มแข็งเพียงเท่าเดียวกับการเชื่อมโยงที่อ่อนแอที่สุดดังนั้นโปรแกรมจะไม่สนใจตัวเลขที่ได้รับการยอมรับมากขึ้น (หนึ่งที่มีอัตราส่วนที่สูงขึ้น) และใช้สิ่งที่อ่อนแอกว่าเพื่อทำการตัดสินใจขั้นสุดท้ายเกี่ยวกับความสำเร็จ

คอนโทรลเลอร์มีสองโหมดพื้นฐานของการทำงาน ในโหมดที่รวดเร็วมีเพียงการอ่านเพียงครั้งเดียวซึ่งได้รับซ้ำ (หลังจากการหมุนลูก) เฉพาะในกรณีที่การอ่านครั้งแรกไม่ได้รับการจัดอันดับดีพอ ในโหมดช้าลง (“ปลอดภัย”) มีการอ่านสองครั้งซึ่งผลลัพธ์ควรตรงกัน

ผู้อ่านได้รับการประเมินในเบลเกรดใน บริษัท Eleks-M ซึ่งผลิตอุปกรณ์คาสิโน การทดสอบดำเนินการกับกล้องวิดีโอ Still พิเศษที่บันทึกการอ่านทุกครั้งโดยอัตโนมัติแล้วภาพ (พร้อมชื่อไฟล์ที่ไม่มีอะไรนอกจากหมายเลขลูกที่รู้จัก) ถูกเรียงลำดับตามลำดับตัวอักษรและการตรวจสอบขั้นสุดท้ายจะดำเนินการด้วยตนเอง

การทดสอบทั้งหมดใช้เวลา 240 ชั่วโมงซึ่งจะช่วยทดสอบความทนทานต่อความทนทานของ Bingo Blower นอกเหนือจากผู้อ่าน หลังจาก 10 วันและลูกบอลอ่าน 115,000 ลูกมีเพียงหนึ่งการอ่านที่ผิดพลาด (ลูก 37 อ่านเป็น 7) โดยผู้อ่านถูกตั้งค่าเป็นโหมดที่รวดเร็ว การทดสอบในเซฟโหมดจะไม่มีความหมายเนื่องจากอาจไม่เกิดข้อผิดพลาด

แนวคิดเชิงกล

เส้นทางทางกายภาพสำหรับลูกบอลบิงโกคือ c