สารบัญ:
- ขั้นตอนที่ 1: ฮาร์ดแวร์
- ขั้นตอนที่ 2: แผนผัง
- ขั้นตอนที่ 3: ร่าง/โค้ด
- ขั้นตอนที่ 4: สิ่งที่เกี่ยวกับ Input Lag?
- ขั้นตอนที่ 5: สิ่งที่เกี่ยวกับ Jamma Racing Cabinets?
- ขั้นตอนที่ 6: รูปบางส่วนหรือไม่เกิดขึ้น
วีดีโอ: Jammarduino DUE - DIY PC to Jamma Interface สำหรับตู้อาเขต: 6 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
คำแนะนำนี้จะแสดงวิธีสร้างเกราะป้องกันอย่างง่ายสำหรับ Arduino DUE เพื่อเชื่อมต่อเครื่องอาร์เคดของแท้ที่มี CRT ความละเอียดต่ำและตัวเชื่อมต่อ jamma กับพีซีของคุณ
โล่เทหลักคือ:
- เพื่อขยายสัญญาณวิดีโอที่ออกมาจากการ์ดแสดงผล (แรงดันไฟฟ้าต่ำเกินไปสำหรับจอภาพ Arcade CRT ของแท้)
- เพื่อป้องกันจอภาพ CRT ความละเอียดต่ำของคุณจากสัญญาณซิงค์แนวนอนความถี่สูงเกินไป
- เพื่อ "แปล" กดปุ่มบนแผงควบคุมอาร์เคดเป็นสิ่งที่พีซีสามารถจัดการได้
ฉันจะแสดงวิธีขยายส่วนต่อประสานที่ใช้ควบคุมวงล้อและสปินเนอร์ของ Arcade Racing
หมายเหตุ: โล่ไม่ได้บังคับให้สัญญาณซิงค์วิดีโอเป็นความถี่ต่ำ: คุณต้องการซอฟต์แวร์เฉพาะสำหรับสิ่งนั้น ฉันแนะนำให้คุณใช้ CRT emudrivers หรือ Soft15KHz
ขั้นตอนที่ 1: ฮาร์ดแวร์
ฉันจะถือว่าคุณมีสถานีบัดกรีและดีบุกด้วยมือและคุณรู้วิธีใช้งาน เนื่องจากแอมพลิฟายเออร์วิดีโอเป็น SMD ที่มีระยะพิทช์ 0.65 มม. ฉันแนะนำให้คุณซื้อฟลักซ์การบัดกรีเพื่อช่วยประสานจุลินทรีย์นั้น ฉันใช้ปากกา Rosing Mildly Activated (RMA) ราคาถูก "ไม่ต้องทำความสะอาด" ที่ให้ผลลัพธ์ที่ยอดเยี่ยม
อินเทอร์เฟซประกอบด้วย:
- 1x บอร์ดไมโครคอนโทรลเลอร์ Arduino DUE
- แอมพลิฟายเออร์วิดีโอ THS7374 1x
- 1x อะแดปเตอร์ TSSOP14 ถึง DIP14
- 1x เครื่องขยายเสียง
- 1x jamma ฟิงเกอร์บอร์ด
- บอร์ดต้นแบบ 1x 5x7 ซม. สองด้าน
- 1x 1N4148 ไดโอด
- ตัวต้านทาน 7x 1Kohm
- ตัวต้านทาน 1x 820 โอห์ม
- ตัวต้านทาน 3x 220 โอห์ม
- เส้นแถบ 1x ระยะห่าง 2.54 มม.
- 1x สาย VGA
- 1x สายสัญญาณเสียง
ขั้นตอนที่ 2: แผนผัง
นี่คือโครงร่างสีของโครงการทั้งหมด ไม่ใช่ออร์โธดอกซ์ แต่ง่ายกว่าในความหวังของฉัน
การเดินสายไฟนั้นง่ายอย่างที่คิด:
- เส้นสีมาจากขั้วต่อ PC VGA ไปยังเครื่องขยายสัญญาณวิดีโอ ตัวต้านทาน 1Kohm ลงกราวด์จะลดกระแสไปยังอินพุตเครื่องขยายสัญญาณวิดีโอ ด้านเอาต์พุต ความต้านทานแบบอนุกรมจะลดกระแสลงสู่ CRT อาร์เคด
- สายการซิงค์นั้น "ซับซ้อน" มากกว่า: การซิงค์แยกจาก VGA นั้นทำแบบคอมโพสิตก่อนจากนั้นจึงลดระดับด้วยตัวแบ่งแรงดันไฟฟ้าเพื่อให้เป็นไปตามข้อกำหนด Arduino DUE (ลอจิก 3.3V) ตัวแบ่งแรงดันไฟฟ้าคำนวณโดยสมมติว่ามีสัญญาณซิงค์ 5V
- แอมพลิฟายเออร์วิดีโอ (THS7374) สามารถจ่ายไฟที่ 3.3V หรือ 5V; เนื่องจากการจ่ายไฟที่ 5V ทำให้สามารถป้อนแรงดันไฟฟ้า/สัญญาณได้หลากหลายขึ้น และด้วยเหตุที่ THS7374 สามารถควบคุมได้ด้วย 3.3V แม้ว่าจะคั้นน้ำผลไม้ที่ 5V ผมก็ไปทาง 5V
- กราวด์วิดีโอ, กราวด์ Arduino DUE, กราวด์ THS7374 และกราวด์ตัวเชื่อมต่อ jamma นั้นลัดวงจร
- สาย Arduino DUE 5V และ Jamma 5V ต้องไม่ลัดวงจร
- ห้ามคั้นแอมป์เสียงจากสาย USB: คุณต้องมีแหล่งภายนอกสำหรับสิ่งนั้นเนื่องจากข้อจำกัดในปัจจุบัน (เช่น PC ATX PSU) การทำเช่นนั้นจะทำให้พอร์ต USB หรือแม้แต่พีซีของคุณเสียหาย
ขั้วต่อ VGA: คำเตือน
ฉันเพิ่งมีโอกาสอัปเดตพีซีที่ใช้กับ jammarduino DUE ของฉัน แม้ว่าฉันจะได้ทดสอบกับพีซีสองเครื่องก่อนหน้านี้ พวกเขาทั้งคู่ก็ใช้การ์ด ATI ของตระกูลเดียวกัน (ATI 9250 และ 9550) พีซีเครื่องใหม่นี้ติดตั้ง HD5750 พร้อมเอาต์พุตแอนะล็อก DVI เดียว (ไม่มี VGA) สิ่งนี้บังคับให้ฉันใช้อะแดปเตอร์ DVI เป็น VGA (แบบพาสซีฟ) หลังจากดิ้นรนฉันสังเกตเห็นว่าสาย VGA ที่เชื่อมต่อกับอะแดปเตอร์จะต้องมีเพียงกราวด์ที่เชื่อมต่อกับพิน 5 ของตัวเชื่อมต่อ VGA เพื่อใช้งานไม่ใช่พินจาก 6 ถึง 10 ตามที่รายงานในแผนผังส่วนใหญ่บนเว็บ โปรดระลึกไว้เสมอว่าในกรณีที่คุณไม่เห็นสัญญาณการซิงค์จากการ์ดแสดงผลของคุณ
ขั้นตอนที่ 3: ร่าง/โค้ด
คุณต้องติดตั้ง Arduino IDE ก่อน คุณต้องติดตั้ง SAM Cortex M3 Core ด้วย (ไม่มีตามค่าเริ่มต้น) สุดท้ายแต่ไม่ท้ายสุด ติดตั้งไดรเวอร์ Arduino DUE ดูบทแนะนำ "การเริ่มต้นใช้งาน Arduino Due" อย่างเป็นทางการสำหรับข้อมูลล่าสุด
แบบร่างที่คุณต้องอัปโหลดไปยัง Arduino DUE ได้แนบมาไว้ที่นี่ เปิดเครื่องรูดและโหลด "jammarduinoDUE.ino" ไปยัง Arduino IDE ของคุณ จากนั้นอัปโหลดไปยัง arduino DUE ผ่านพอร์ต "การเขียนโปรแกรม" หลังจากอัปโหลดภาพร่างสำเร็จแล้ว ให้ถอดสาย USB ออกจากพอร์ต "การเขียนโปรแกรม" และเชื่อมต่อ Arduino DUE ผ่านพอร์ต "Native USB" มิฉะนั้นส่วนอินพุตของโค้ดจะไม่ทำงาน
โดยทั่วไป Arduino DUE จะวัดความถี่ในการซิงค์และปิดใช้งานเครื่องขยายสัญญาณวิดีโอเมื่อการซิงค์สูงเกินไปสำหรับ CRT ที่มีความละเอียดต่ำ Arduino DUE จัดการกับอินพุตที่มาจากแผงควบคุมด้วย โดยส่งคีย์ MAME เริ่มต้นเมื่อกดปุ่มเฉพาะ ฟังก์ชัน shift (เปิดใช้งานโดยกดปุ่ม P1 START ค้างไว้) รวมอยู่ด้วย เช่น อินเทอร์เฟซเชิงพาณิชย์
ในตารางคีย์แมปเริ่มต้น คุณสามารถเปลี่ยนคีย์แมปเริ่มต้นหรือเพิ่มปุ่มตามที่คุณต้องการโดยตรงบนร่างได้อย่างง่ายดาย
ตัวอย่างเช่น หากคุณต้องการกำหนดปุ่มควบคุมระดับเสียงสำหรับโปรแกรมจำลอง คุณควรกำหนดปุ่มเหล่านั้น (เช่น แป้นกด "+" สำหรับเพิ่มระดับเสียง และแป้นกด "-" สำหรับลดระดับเสียง) ในเมนูปุ่มอีมูก่อน จากนั้นเพิ่มปุ่ม shift ไปที่ปุ่มที่คุณต้องการให้เพิ่มหรือลดระดับเสียง ให้บอกว่าฉันต้องการเพิ่มระดับเสียงโดยกดปุ่ม shift และปุ่ม Player 1 3 ฉันจะแก้ไขบรรทัด
{26, สูง, 0, 180, 180}, //เว้นวรรค - P1 B3
ถึง
{26, สูง, 0, 180, 223}, //เว้นวรรค - P1 B3 (+)
"223" นั้นคือรหัสอักขระ ASCII สำหรับปุ่มกด "+"
ฉันจะให้คุณหาวิธีกำหนด "-" (หรืออะไรก็ตามที่คุณต้องการ) ให้กับฟังก์ชัน "ลดระดับเสียง" เป็นแบบฝึกหัด (คำแนะนำ: รหัส ASCII 222):)
โปรดทราบว่าใน MAME คุณสามารถกำหนดโวลุ่มโหมดบริการเท่านั้น ไม่ใช่โวลุ่มการจำลองทั่วไป ซึ่งหมายความว่าหากบอร์ดจำลองไม่อนุญาตให้มีการควบคุมระดับเสียงของซอฟต์แวร์ ระดับเสียงจะไม่ได้รับผลกระทบ
ขั้นตอนที่ 4: สิ่งที่เกี่ยวกับ Input Lag?
ฉันทำการทดสอบเพื่อดูว่าโค้ดสามารถแนะนำได้มากน้อยเพียงใด โดยการส่ง 3 ปุ่มพร้อมกันการวนซ้ำจะใช้เวลาประมาณ 4 มิลลิวินาทีในการดำเนินการซึ่งน้อยกว่า 33 มิลลิวินาทีต่อเฟรมที่ 30 FPS
ขั้นตอนที่ 5: สิ่งที่เกี่ยวกับ Jamma Racing Cabinets?
ล้อโพเทนชิออมิเตอร์
หากตู้ของคุณเป็นตู้แบบรถแข่ง เป็นไปได้มากว่าล้อเป็นแบบโพเทนชิออมิเตอร์ (คุณสามารถเห็นโพเทนชิออมิเตอร์ 5Kohm ที่ด้านหลังของแผงควบคุม)
ก่อนอื่นให้ดาวน์โหลดและติดตั้งไลบรารีจอยสติ๊ก (ณ วันที่ปัจจุบันมีเพียงเวอร์ชัน 1 ของไลบรารีที่กล่าวว่าเข้ากันได้กับ arduino DUE แต่ยังคงเป็นไลบรารีที่ดีมาก)
จากนั้นเพิ่มสองสามบรรทัดที่ตามหลังภาพร่างในขั้นตอนที่ 4 เพื่อจัดการกับวงล้อได้อย่างง่ายดาย (ตำแหน่งที่จะวางเส้นที่เหลือให้คุณเป็นแบบฝึกหัด…)
#รวม
int deadZone = 0;
การตั้งค่าเป็นโมฆะ () {
จอยสติ๊ก.begin();}
วงเป็นโมฆะ () {
int readPot = analogRead (A3);
int wheelPos = แผนที่ (readPot, 0, 1023, -127, 127);
if(wheelPos>deadZone || wheelPos<-deadZone){ Joystick.setXAxis(wheelPos);}
อย่างอื่น {Joystick.setXAxis(0);}
}
อย่างที่คุณเห็น คุณสามารถตั้งค่าเดดโซนได้หากจำเป็น (ในวงล้ออาร์เคดที่ทำงานได้ดี ทางที่ดีควรตั้งค่าให้เป็นศูนย์)
การเดินสายโพเทนชิออมิเตอร์ไปยัง Arduino DUE นั้นตรงไปตรงมา: หมุดด้านข้างของโพเทนชิออมิเตอร์ไปที่ +3.3V และ GND, พินที่ปัดน้ำฝนไปยังพอร์ตแอนะล็อก Arduino DUE (ดูรูปสำหรับการอ้างอิง) ฉันกำหนดขาอะนาล็อก 3 (A3) ที่นี่เป็นอินพุตสำหรับที่ปัดน้ำฝนของโพเทนชิออมิเตอร์แบบล้อ แต่คุณสามารถตั้งค่าพินอะนาล็อกที่เหมาะสมกับความต้องการของคุณมากที่สุด
PS: คุณรู้หรือไม่ว่าแป้นเหยียบในตู้แข่งมักจะถูกควบคุมโดยโพเทนชิออมิเตอร์ กว่าทางเทคนิคแล้วล้อและแป้นเหยียบเป็นอุปกรณ์เดียวกันกับที่มีรูปร่างต่างกัน ซึ่งหมายความว่ารหัสที่นี่สามารถใช้เพื่อควบคุมแป้นเหยียบอาร์เคดของแท้ได้เช่นกัน;)
ล้อออปติคอล
หากวงล้อของคุณเป็นแบบออปติคัล ก็สามารถจัดการได้อย่างง่ายดายเช่นกัน อีกครั้งด้วยการดัดแปลงเล็กน้อยเพื่อสเก็ตช์เริ่มต้น
Pinout ทั่วไปสำหรับตัวเข้ารหัส Arcade แบบออปติคัล (สปินเนอร์ Taito, ตัวเข้ารหัสล้อ Atari และอื่นๆ) คือ:
1. OptoA OUT
2. +5V
3. GND
4. OptoB ออก
เชื่อมต่อ 2 และ 3 กับ Arduino DUE 5V และ GND และ 1 และ 4 กับพินดิจิตอลใด ๆ ที่คุณต้องการให้ความสนใจว่าตัวแบ่งแรงดันไฟฟ้ามีความจำเป็นเพื่อลดเอาต์พุต 5V จากตัวเข้ารหัสออปติคัลเป็น 3.3V arduino DUE ที่สามารถจัดการได้. อย่าส่งเอาต์พุต OptoA และ/หรือ OptoB 5V ไปยังพินอินพุต Arduino DUE โดยตรง ไม่เช่นนั้นคุณอาจจะทอดอินพุตเหล่านั้นหรือแม้แต่บอร์ดทั้งหมด คุณได้รับการเตือน
ในภาพตัวอย่างที่นี่ ฉันจะใช้พินดิจิทัล 2 และพินดิจิทัล 3 เป็นออปติคัลเอาท์ A และออปติคัลเอาท์ B
#รวม
บูลีน optA_state = สูง;
int xAxisMov = 2;
การตั้งค่าเป็นโมฆะ () {
โหมดพิน (2, INPUT_PULLUP); //OptA
โหมดพิน (3, INPUT_PULLUP); //OptB
Mouse.begin();
}
วงเป็นโมฆะ () {
ถ้า (optA_state == สูง && digitalRead(2) == ต่ำ){
optA_state=!optA_state;
if(digitalRead(3) == HIGH){ Mouse.move(xAxisMov, 0, 0);} else{Mouse.move(-xAxisMov, 0, 0);} } }//สิ้นสุดการวนซ้ำ
นี่คือการเข้ารหัสออปติคัล 1X Counting ความละเอียดต่ำ เพียงพอสำหรับแอปพลิเคชัน Arcade แต่คุณสามารถเพิ่มความละเอียดได้อย่างง่ายดายโดยการเพิ่มโค้ดบางบรรทัด
PS: คุณรู้หรือไม่ว่าล้ออาร์เคดแบบออปติคัลและสปินเนอร์อาร์เคดเป็นอุปกรณ์เดียวกันกับที่มีรูปร่างต่างกัน คุณรู้หรือไม่ว่าแทร็กบอลเป็นสปินเนอร์ 2 แกนในทางเทคนิค? ซึ่งหมายความว่ารหัสที่นี่สามารถใช้เพื่อควบคุมสปินเนอร์อาร์เคดของแท้และมีแทร็กบอลที่ดัดแปลงได้ง่ายเช่นกัน;)
ขั้นตอนที่ 6: รูปบางส่วนหรือไม่เกิดขึ้น
นี่คือภาพบางส่วนของโล่ที่ฉันทำ มันไม่ใช่งานระดับสูง (พนันได้เลยว่าฉันไม่ใช่มืออาชีพ) แต่มันโยก 100% ใน jamma Arcade Cabinet ของฉัน!
แนะนำ:
จอ LCD 5V พร้อม Arduino Due 3.3V I2C: 5 ขั้นตอน
จอแสดงผล LCD 5V พร้อม Arduino Due 3.3V I2C: โพสต์นี้มีวัตถุประสงค์เพื่ออธิบายวิธีที่ง่ายกว่าในการใช้ Arduino Due (หรือบอร์ด 3.3V อื่น ๆ ) ด้วยจอแสดงผล LCD 16x2 ยอดนิยมพร้อมโมดูลอะแดปเตอร์ I2C ปัญหาเริ่มต้นคือ LCD ต้องการ 5V เพื่อให้แบ็คไลท์ทำงานได้อย่างถูกต้อง แต่ SCL และ SDA
เลือก SD Interface สำหรับ ESP32: 12 ขั้นตอน (พร้อมรูปภาพ)
เลือก SD Interface สำหรับ ESP32: คำแนะนำนี้แสดงบางอย่างเกี่ยวกับการเลือกอินเทอร์เฟซ SD สำหรับโครงการ ESP32 ของคุณ
Yaesu FT-100 PC Link Interface สำหรับโหมดดิจิตอล: 3 ขั้นตอน
Yaesu FT-100 PC Link Interface สำหรับโหมดดิจิตอล: ที่นี่ฉันนำเสนอแนวทางในการสร้างอินเทอร์เฟซสำหรับ PC link สำหรับ Yaesu FT-100 อินเทอร์เฟซนี้ช่วยให้คุณสามารถส่งและรับสัญญาณเสียงจากการ์ดเสียงเพื่อใช้งานโหมดดิจิตอล HAM (FT8, PSK31 เป็นต้น) มีข้อมูลเพิ่มเติม
Bluetooth Wireless Interface สำหรับ Mitutoyo Calipers and indicators: 8 ขั้นตอน (พร้อมรูปภาพ)
อินเทอร์เฟซไร้สาย Bluetooth สำหรับเครื่องวัดเส้นผ่าศูนย์กลางและตัวชี้วัด Mitutoyo: ปัจจุบันมีเครื่องวัดเส้นผ่าศูนย์กลาง ไมโครมิเตอร์ ตัวบ่งชี้ และอุปกรณ์อื่นๆ ของ Mitutoyo Digimatic หลายล้านรายการ หลายคนเช่นฉันใช้อุปกรณ์เหล่านั้นเพื่อรวบรวมข้อมูลลงในพีซีโดยตรง ช่วยลดการเข้าสู่ระบบและพิมพ์ในบางครั้งหลายร้อย
การเพิ่ม 24LC256 EEPROM ให้กับ Arduino Due: 3 ขั้นตอน
การเพิ่ม 24LC256 EEPROM ให้กับ Arduino Due: Arduino เนื่องจากไม่มี eeprom คำแนะนำนี้เพิ่มหนึ่งรายการและช่วยให้คุณสามารถเก็บค่าในหน่วยความจำแบบไม่ลบเลือนที่จะคงอยู่จากการอัพเดตเฟิร์มแวร์ Arduino