มันทำงานยังไงนะ?
เจ้าโทรศัพท์หมุนโบราณตัวนี้มันมีสมองกลฝังอยู่ข้างใน (ก็ [Raspberry Pi](https://s.shopee.co.th/6pvZFdZdRf) ไง) ที่มันคุยกับ radiooooo.com ซึ่งเป็นเว็บวิทยุออนไลน์ แล้วก็ยังมีไมโครคอนโทรลเลอร์ ([Arduino](https://s.shopee.co.th/7fUgFAWSki)) ซ่อนอยู่หลังแผนที่โลกอีกตัว คอยควบคุมการเลือกประเทศให้เรา
รวมๆ แล้วก็ได้โปรเจกต์ IoT ที่เท่ไม่เบาเลยล่ะน้อง!



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



เจาะลึกเทคนิค

โปรเจกต์นี้ประกอบด้วยหลายส่วน:
โทรศัพท์หมุนโบราณ
Raspberry Pi มีหน้าที่:
- เล่นเพลงผ่าน radiooooo.com
- ตรวจจับเมื่อยกหูโทรศัพท์ขึ้น/วางลง
- ตรวจจับหมายเลขที่หมุนเข้า
Arduino มีหน้าที่:
- ตรวจจับว่าประเทศไหนถูกเลือกบนแผนที่ (ผ่านแจ็คคอนเนคเตอร์)
- ส่งข้อมูลนี้ไปให้ RPi ผ่าน Serial
ขั้นตอนทำตามกันไปเลย
ขั้นตอนที่ 1: หาโทรศัพท์หมุนสักเครื่องมา
ไปหามาจากร้านของมือสอง จากคนรู้จัก หรือแม้แต่ถังขยะก็ได้! ของพี่ได้มาจากคุณย่านี่แหละ
ขั้นตอนที่ 2: ศึกษาว่าโทรศัพท์หมุนของเราทำงานยังไง
โทรศัพท์หมุนแต่ละเครื่องไม่เหมือนกัน ของน้องอาจทำงานไม่เหมือนของพี่เป๊ะ แต่ส่วนประกอบก็คล้ายๆ กัน สำหรับโปรเจกต์นี้ ส่วนที่เราต้องใช้คือ:
- 📞 กลไกตรวจจับการยกหูโทรศัพท์ขึ้น/วางลง

ในกรณีของพี่ สวิตช์พวกนี้อยู่บนบอร์ดของโทรศัพท์เลย: พี่ใช้มัลติมิเตอร์หาขาแล้วบัดกรีสายไฟ 2 เส้นจากตรงนั้น เส้นหนึ่งต่อไปที่ 3.3V ของ Rpi (ผ่านตัวต้านทาน 220 โอห์ม) และอีกเส้นต่อไปที่ขา PIN 18 ของ RPI (GPIO 24)
- 🔈 สปีกเกอร์ในหูโทรศัพท์
โดยการคลายสกรูหูโทรศัพท์ เราก็เข้าถึงสปีกเกอร์ได้ มีสายไฟ 2 เส้น (บวกและลบ) ที่เราสามารถต่อเข้ากับสายเสียงได้ ปลายสายเสียงของเราควรมีหัวแจ็คเพื่อจะได้เสียบเข้ากับช่องเสียงออกของ Raspberry Pi

- ⚙️ โมดูลหมุน (Rotary module)
ในโมดูลหมุนมีส่วนที่แตกต่างกัน 2 ส่วน:
- DIAL SWITCH: สวิตช์ที่ตรวจจับว่าเริ่มหมุนหมายเลขแล้ว
- NUMBER SWITCH: สวิตช์ที่เปิด-ปิด ตามจำนวนครั้งของหมายเลขที่หมุน ตัวอย่างเช่น หมายเลข 6 สวิตช์จะเปิด-ปิด 6 ครั้ง ข้อยกเว้นเดียวคือเลข 0 ซึ่งจะทำให้เกิดพัลส์ 10 ครั้ง



พี่ต่อสายไฟ 2 เส้นไปที่ DIAL SWITCH ของพี่ เส้นหนึ่งไปที่ 3.3V ของ Rpi (ผ่านตัวต้านทาน 220 โอห์ม) และอีกเส้นไปที่ขา PIN 10 ของ RPI (GPIO 15)
พี่ก็ต่อสายไฟ 2 เส้นสำหรับ NUMBER SWITCH ด้วย เส้นหนึ่งไปที่ 3.3V ของ Rpi (ผ่านตัวต้านทาน 220 โอห์ม) และอีกเส้นไปที่ขา PIN 16 ของ RPI (GPIO 23)
ขั้นตอนที่ 3: สร้างแผนที่!
แผนที่จะใช้เลือกประเทศสำหรับวิทยุหมุนของเรา พี่สร้างของพี่โดยการติดแผนที่กระดาษบนแผ่นโลหะ น้องใช้วัสดุอะไรก็ได้ แต่ต้องแน่ใจว่ามันบางพอที่จะยึดหัวเสียบแจ็คบนแผ่นได้




เมื่อหัวเสียบเสียงอยู่บนแผนที่เรียบร้อยแล้ว ก็ไปต่อที่การเดินสายได้เลย
Arduino เชื่อมต่อกับ Raspberry Pi ผ่านสาย USB (สำหรับทั้งไฟเลี้ยงและการสื่อสาร Serial)


น้องสามารถหาโค้ด Arduino ได้ใน Git repository ด้านล่าง
- ขั้นตอนที่ 4: ตั้งค่า Raspberry Pi ของน้อง
ดูแผนภาพในส่วน SCHEMATICS ด้านล่างสำหรับคำแนะนำโดยละเอียดเกี่ยวกับการเดินสายไปยัง Raspberry Pi ของน้อง
ตัวเลือกเสริม: พี่ใส่ LED ด้วย ซึ่งต่อกับ pin 15 (GPIO 22) LED นี้จะกระพริบเมื่อสคริปต์ main.py กำลังทำงาน
ตัวเลือกเสริม: เพิ่มปุ่มกดที่อนุญาตให้รีบูต/ปิด Pi ของน้องได้ ของพี่มีสายไฟ 2 เส้นที่ต่อกับ PIN 13 (GPIO 27) และ GROUND ตามลำดับ
พี่เตรียมสคริปต์หลัก main.py ไว้ใน GitHub repository ด้านล่างแล้ว สคริปต์พร้อมใช้และมีคอมเมนต์ไว้ในกรณีที่น้องสนใจว่ามันทำงานยังไง
โปรดทราบ: การรันสคริปต์ Python โดยไม่มี Arduino เชื่อมต่ออยู่จะทำให้เกิดข้อผิดพลาด
Raspberry Pi ของพี่ถูกตั้งค่าให้ทำงานแบบ Headless (ไม่มีหน้าจอ) มีบางอย่างที่น้องต้องตั้งค่าถ้าอยากให้มันทำงาน:
- ต้องแน่ใจว่า GUI (Graphical User Interface) เริ่มทำงานแม้จะไม่ได้ต่อจอภาพ เราต้องการมันเพื่อรันเว็บไซต์ของเรา
ใน Terminal พิมพ์:
sudo nano /boot/config.txt
จากนั้น เอาเครื่องหมายคอมเมนต์ออกจากบรรทัดนี้:
hdmi_force_hotplug=1
บันทึกโดยกด CTRL+X และยอมรับการเปลี่ยนแปลงโดยกด y เมื่อถูกถาม
- เปิดเว็บไซต์ radiooooo.com ตอนเริ่มระบบ
ใน Terminal พิมพ์:
sudo nano /etc/xdg/lxsession/LXDE-pi/autostart
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์:
/usr/bin/chromium-browser --ignore-certificate-errors --disable-restore-session-state https://www.radiooooo.com
- รันสคริปต์ Python ตอนเริ่มระบบ
ในไฟล์เดียวกันนี้ เพิ่มบรรทัดต่อไปนี้:
@/usr/bin/python /home/pi/your/path/main.py
@/usr/bin/python /home/pi/your/path/shutdown_button.py
- อัปเดตสคริปต์ให้ตรงกับพอร์ต USB ที่น้องต่อ Arduino เข้าไป
รันคำสั่งต่อไปนี้ใน Terminal (โดยที่ Arduino ยังไม่ได้เสียบ):
ls /dev/tty*
รายการพอร์ตทั้งหมดที่มีจะแสดงขึ้นมา จากนั้นเสียบ Arduino ของน้องเข้าไปแล้วรันคำสั่งเดิมอีกครั้ง พอร์ตที่ปรากฏขึ้นมาคือพอร์ตของ Arduino (ในกรณีของพี่คือ /dev/ttyACM0) เปิดสคริปต์ main.py แล้วอัปเดตบรรทัดต่อไปนี้ให้ตรงกับพอร์ตของน้อง: