สารบัญ:
- ขั้นตอนที่ 1: ฉันถือว่าคุณมี OpenWrt แล้ว…
- ขั้นตอนที่ 2: ซอฟต์แวร์และเครื่องมือ
- ขั้นตอนที่ 3: สร้างแอปขั้นต่ำ
- ขั้นตอนที่ 4: การเพิ่มข้อมูลบางอย่าง: จำนวนไคลเอนต์, ที่อยู่ IP WAN, เวลาทำงาน
- ขั้นตอนที่ 5: การควบคุม WiFi: เปิด/ปิด
- ขั้นตอนที่ 6: แผนภูมิสถิติระบบ
- ขั้นตอนที่ 7: สถานะการหมุน HDD
- ขั้นตอนที่ 8: แผนภูมิกิจกรรมเครือข่าย
- ขั้นตอนที่ 9: การแจ้งเตือน
- ขั้นตอนที่ 10: การทำงานอัตโนมัติในเบื้องหลัง
- ขั้นตอนที่ 11: บทสรุปและแนวคิดเพิ่มเติม
วีดีโอ: แอป Android/iOS เพื่อเข้าถึงเราเตอร์ OpenWrt ของคุณจากระยะไกล: 11 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
ฉันเพิ่งซื้อเราเตอร์ใหม่ (Xiaomi Mi Router 3G) และแน่นอน ฮาร์ดแวร์ชิ้นใหม่ที่ยอดเยี่ยมนี้เป็นแรงบันดาลใจให้ฉันเริ่มทำงานในโครงการนี้;)
ขั้นตอนที่ 1: ฉันถือว่าคุณมี OpenWrt แล้ว…
ฉันต้องติดตั้ง OpenWrt ก่อน… ส่วนใหญ่ฉันทำตามคำแนะนำนี้ (เฉพาะสำหรับเราเตอร์รุ่นนี้):https://dzone.com/articles/hacking-into-xiaomi-mi-…ในขณะที่ทำงานนี้ ฉันพบวิดีโอที่ยอดเยี่ยมนี้: การติดตั้ง Openwrt, เกณฑ์มาตรฐาน WiFi, Girlfriend Flashing. Wow ฉันหัวเราะหนักมาก!:)
ความสนใจ! การติดตั้ง OpenWrt สามารถทำให้เราเตอร์ของคุณพังได้ แต่เมื่อเสร็จแล้วจะปลดล็อกพลังและการควบคุมอย่างเต็มที่ ฉันไม่กล้าให้คำแนะนำใดๆ ในที่นี้ เนื่องจากคำแนะนำอาจแตกต่างกันไปตามรุ่นเราเตอร์ทุกรุ่น
แต่ถ้าคุณมี OpenWrt บนเราเตอร์อยู่แล้ว คุณจะสามารถเริ่มด้วยบทช่วยสอนนี้ได้ในเวลาไม่นาน
BTW บอร์ดพัฒนาบางตัวมาพร้อมกับ OpenWrt แบบแกะกล่อง เช่น Onion Omega, VoCore, LinkIt Smart 7688 และอื่นๆ บทช่วยสอนนี้ยังอธิบายแนวคิดพื้นฐานเบื้องหลังการสร้างแอพดังกล่าว ดังนั้นคุณจึงสามารถปรับให้เข้ากับ Raspberry Pi และสิ่งที่ชอบได้อย่างง่ายดาย
สำหรับโปรเจ็กต์นี้ ฉันจะใช้ซอฟต์แวร์ที่ติดตั้งล่วงหน้าเป็นส่วนใหญ่ (มีในเราเตอร์ที่เปิดใช้งาน OpenWrt) แต่สำหรับฟังก์ชันขั้นสูงบางอย่าง ฉันต้องติดตั้งแพ็คเกจเพิ่มเติม ทำได้ในไม่กี่คลิก ดังนั้นฉันจะรวมคำแนะนำไว้ที่นี่
นอกจากนี้ ฉันคิดว่าคุณรู้อยู่แล้ว:
- วิธีเปิด/ใช้งานเทอร์มินัล SSH กับเราเตอร์ OpenWrt ของคุณ
- วิธีอัปโหลด/แก้ไขไฟล์บนเราเตอร์ของคุณ (ใช้ FileZilla หรือ scp/sftp)
- วิธีทำงานกับคอนโซล Linux
ขั้นตอนที่ 2: ซอฟต์แวร์และเครื่องมือ
ทางฝั่งสมาร์ทโฟน ผมใช้ Blynk มันมีแอพ iOS และ Android เพื่อควบคุมฮาร์ดแวร์ใด ๆ คุณสามารถสร้างอินเทอร์เฟซกราฟิกที่สวยงามสำหรับโปรเจ็กต์ทั้งหมดของคุณได้ง่ายๆ เพียงลากและวางวิดเจ็ตบนสมาร์ทโฟนของคุณโดยตรง Blynk ส่วนใหญ่จะใช้กับ Arduino, Raspberry Pi เป็นต้น แต่ทำไมไม่รันบนเราเตอร์เองล่ะ;)
ในด้านอุปกรณ์ ฉันจะใช้ Lua เพื่อเขียนสคริปต์ฟังก์ชันที่จำเป็น ฉันสามารถใช้ Python หรือ Node.js ได้ แต่น่าเสียดายที่ตัวเลือกเหล่านี้ไม่พร้อมใช้งานเสมอ เนื่องจากขาดทรัพยากรในเราเตอร์บางตัว หรือ C/C++ แต่ ไม่สะดวกในการทำงานด้วย (คอมไพล์ใหม่สำหรับการเปลี่ยนแปลงทุกครั้ง ฯลฯ) ในทางกลับกัน Lua ติดตั้งไว้ล่วงหน้า ใช้งานง่ายและเรียนรู้ ใช้โดยเว็บอินเตอร์เฟสเริ่มต้น LuCI
ขั้นตอนที่ 3: สร้างแอปขั้นต่ำ
การเริ่มต้นใช้งาน Blynk และ Lua นั้นง่ายเหมือน:
- ดาวน์โหลดแอป Blynk (จาก App Store, Google Play)
- สร้างโครงการใหม่และรับ Auth Token
- ทำตามคำแนะนำในการติดตั้ง Blynk Lua สำหรับ OpenWrt
ใช้ SSH เพื่อเข้าถึงคอนโซลเราเตอร์ของคุณ หลังจากรันตัวอย่างเริ่มต้น:
lua./examples/client.lua
เราควรจะเห็นสิ่งนี้:
กำลังเชื่อมต่อ…
จับมือ SSL… พร้อมแล้ว
ซึ่งหมายความว่าสร้างการเชื่อมต่อแบบสองทิศทางที่ปลอดภัยกับแอปแล้ว เย้!
ตอนนี้เราสามารถขยายตัวอย่างที่ให้มาได้อย่างง่ายดาย ดังนั้นมันจึงทำสิ่งที่น่าสนใจ ฉันได้สร้างสำเนาของตัวอย่างนี้เพื่อแก้ไข:
cp./examples/client.lua./blynkmon.lua
ขั้นตอนที่ 4: การเพิ่มข้อมูลบางอย่าง: จำนวนไคลเอนต์, ที่อยู่ IP WAN, เวลาทำงาน
แนวคิดพื้นฐานคือการรับข้อมูลจากระบบปฏิบัติการเป็นระยะ ทำการคำนวณง่ายๆ หากจำเป็น จากนั้นส่งผลไปยัง Blynk เพื่อแสดงผล
ใน Linux/OpenWrt เรามีหลายวิธีในการรับข้อมูลระบบ:
- เรียกใช้คำสั่งและแยกวิเคราะห์ข้อความที่ส่งออก
- เรียกใช้คำสั่งและดูรหัสทางออกที่ส่งคืน
- อ่านไฟล์ระบบที่อยู่ในไดเร็กทอรี /proc/ และ /sys/class/
ตอนนี้ฉันต้องการแสดงจำนวนอุปกรณ์ที่เชื่อมต่อ
เมื่อฉันรัน cat /proc/net/arp บนคอนโซล มันจะแสดงรายการอุปกรณ์ที่รู้จัก พร้อมกับที่อยู่ MAC และ IP:
ที่อยู่ IP ประเภท HW แฟล็ก ที่อยู่ HW Mask Device
192.168.10.206 0x1 0x2 78:02:f8:fb:d6:bf * br-lan 194.---------- 0x1 0x2 4c:5e:0c:14:e0:5c * eth0.2 192.168.10.162 0x1 0x0 04:b1:67:2f:e3:74 * br-lan
เราสามารถแยกวิเคราะห์ได้โดยตรงใน Lua แต่การใช้ยูทิลิตีแบบพิเศษมักจะง่ายกว่า บน Linux สิ่งเหล่านี้คือ grep, head, tail, cut, wc, awk
ในการรับจำนวนไคลเอนต์จากเอาต์พุต arp ฉันต้องกรองตาราง (ลบรายการที่ไม่เกี่ยวข้อง) และนับแถวของตาราง ซึ่งส่งผลให้คำสั่งต่อไปนี้:
cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
ลองดู:
root@router:~/lua-blynk# cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
1
ยอดเยี่ยม. ตอนนี้เราเข้าใจแล้วว่าเราจะรวบรวมข้อมูลที่จำเป็นทั้งหมดได้อย่างไร มาทำให้เป็นอัตโนมัติกัน เพื่อให้โค้ดของเราสะอาดและขยายได้ ให้สร้างฟังก์ชันตัวช่วยบางอย่าง:
ฟังก์ชัน exec_out(cmd)
local file = io.popen(cmd) ถ้าไม่ใช่ file ให้คืนค่า nil end local output = file:read('*all') file:close() print("Run: "..cmd.." -> ".. เอาต์พุต) ส่งคืนฟังก์ชันสิ้นสุดเอาต์พุต read_file(เส้นทาง) ไฟล์ในเครื่อง = io.open(เส้นทาง, "rb") หากไม่ใช่ไฟล์ ให้ส่งคืนเนื้อหาในเครื่องที่สิ้นสุดศูนย์ = ไฟล์:อ่าน "*a" ไฟล์:close() พิมพ์("อ่าน: "..path.." -> "..content) ส่งคืนเนื้อหา end
การใช้ยูทิลิตีเหล่านี้ทำให้เราสามารถใช้ฟังก์ชันดึงข้อมูลจริงได้:
ฟังก์ชัน getArpClients()
return tonumber(exec_out("cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l")) ฟังก์ชันสิ้นสุด getUptime() return tonumber(exec_out("cat /proc/uptime | awk '{print $1 }'")) สิ้นสุดฟังก์ชัน getWanIP() return exec_out("ifconfig eth0.2 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'") สิ้นสุด
คุณสามารถเรียกใช้บางส่วนของคำสั่งเชลล์เหล่านี้ เพื่อทำความเข้าใจวิธีการทำงานให้ลึกซึ้งยิ่งขึ้น และปรับให้เข้ากับความต้องการของคุณ
ส่วนที่ง่ายที่สุดคือการส่งข้อมูลไปยังแอป Blynk ตัวอย่างเริ่มต้นได้ตั้งค่าตัวจับเวลาแล้ว ซึ่งรันโค้ดบางตัวทุกๆ 5 วินาที ดังนั้นเราจึงนำกลับมาใช้ใหม่:
local tmr1 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 5000, func = ฟังก์ชัน ()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) blynk:virtualWrite(12, getWanIP()) end}
ในแอป เราเพิ่มวิดเจ็ตป้ายกำกับ 3 รายการ และกำหนดให้กับ Virtual Pins 10, 11, 12 ตามลำดับ
แม้ว่าจะใช้งานได้ แต่ก็ค่อนข้างไม่มีประสิทธิภาพ เนื่องจาก WAN IP หรือจำนวนไคลเอ็นต์ไม่ได้อัปเดตบ่อยนัก มาแก้ไขปัญหานี้กันเถอะ
สำหรับ WAN IP เราย้ายไปที่ตัวจัดการที่เชื่อมต่อ จะทำงานทุกครั้งที่เราเตอร์สร้างการเชื่อมต่อกับ Blynk Cloud นี้ควรจะเพียงพอ:
blynk:on("เชื่อมต่อ", function()
print("พร้อม") blynk:virtualWrite(12, getWanIP()) end)
สำหรับเวลาทำงานและหมายเลขลูกค้า เราสร้างตัวจับเวลาแยกกันโดยใช้เวลา 5 นาที ช่วงเวลา:
local tmr2 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 5*60*1000, func = ฟังก์ชัน ()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) end}
ขั้นตอนที่ 5: การควบคุม WiFi: เปิด/ปิด
จนถึงตอนนี้ เราได้รับข้อมูลจากอุปกรณ์เพียงบางส่วน มาลองควบคุมกันดู!
blynk:on("V20", ฟังก์ชัน(พารามิเตอร์)
if param[1] == "1" แล้ว os.execute("wifi up") อื่น os.execute("wifi down") สิ้นสุด)
ในด้านแอป ฉันเพิ่งเพิ่มวิดเจ็ตปุ่ม (โหมด: สวิตช์) และกำหนดให้เป็น V20
แค่นั้นแหละ. อัศจรรย์.
ขั้นตอนที่ 6: แผนภูมิสถิติระบบ
ฟังก์ชัน getCpuLoad()
return tonumber(exec_out("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $2+$4}'")) end function getRamUsage() return tonumber(exec_out("free | grep Mem | awk ' {พิมพ์ ($$3-$7)/$2 * 100.0}'")) สิ้นสุด
เราต้องส่งข้อมูลไปยัง Blynk ด้วย (ลองใช้ tmr1 อีกครั้ง):
local tmr1 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 5000, func = ฟังก์ชัน ()
blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) สิ้นสุด}
ที่ด้านแอพ เพิ่มวิดเจ็ต SuperChart เพิ่ม CPU, สตรีมข้อมูล RAM และกำหนดให้กับ V5, V6
ขั้นตอนที่ 7: สถานะการหมุน HDD
เราเตอร์ของฉันมีไดรฟ์ HDD ภายนอกที่เชื่อมต่อเป็นอุปกรณ์ Network Attached Storage ประเด็นคือ ไดรฟ์นี้ได้รับการกำหนดค่าให้เริ่มหมุนเมื่อมีคนเข้าถึง และให้ระงับหลังจากหมดเวลา
แน่นอนว่ามันคงจะเจ๋งถ้ารู้ว่ามันเปิดกี่ครั้งตลอดทั้งวัน ดังนั้นฉันจึงเพิ่มสตรีมข้อมูลอื่นลงในแผนภูมิระบบของฉัน
การรับสถานะของไดรฟ์ HDD นั้นยากกว่าเล็กน้อย แต่ฉันพบวิธี! ก่อนอื่น ติดตั้ง smartmontools จากคอนโซล SSH:
opkg update
opkg ติดตั้ง smartmontools
จากนั้นในรหัสของเรา เราต้องเรียกใช้คำสั่งพิเศษและตรวจสอบรหัสออก:
ฟังก์ชัน exec_ret(cmd)
local exit = os.execute(cmd) print("Run: "..cmd.." -> exit:"..exit) ส่งคืนฟังก์ชันสิ้นสุดทางออก getHddSpinning() if exec_ret("smartctl --nocheck=standby --info /dev/sda > /dev/null") == 0 แล้ว return 1 กลับ 0 end end
หมายเหตุ: HDD ของฉันคือ /dev/sda
ขั้นตอนที่ 8: แผนภูมิกิจกรรมเครือข่าย
เราสร้างวิดเจ็ต SuperChart อื่น (คล้ายกับวิดเจ็ตก่อนหน้า) เพิ่มสตรีมข้อมูล TX และ RX และกำหนดให้กับ V1 และ V2 หมายเหตุ: ฉันต้องการแสดงสถานะพอร์ต WAN และพอร์ต WAN ของฉันคือ eth0.2
ฟังก์ชั่นผู้ช่วย:
ฟังก์ชัน getWanRxBytes()
ส่งคืน tonumber(read_file("/sys/class/net/eth0.2/statistics/rx_bytes")) ฟังก์ชันสิ้นสุด getWanTxBytes() ส่งคืน tonumber(read_file("/sys/class/net/eth0.2/statistics/tx_bytes")) จบ
ถัดไป เพิ่มโค้ดบางส่วนลงใน tmr1 เดียวกัน สิ่งนี้ซับซ้อนกว่า เนื่องจากเราต้องคำนวณและแสดงส่วนต่างของไบต์ที่รับ/ส่งเท่านั้น:
prevTx ท้องถิ่น, prevRx
local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() ถ้า prevTx และ prevTx ~= tx แล้ว blynk:virtualWrite(1, tx - prevTx) จะสิ้นสุดหาก prevRx และ prevRx ~= rx จากนั้น blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) britelynk:virtualHinning)) จบ}
ขั้นตอนที่ 9: การแจ้งเตือน
ฉันยังต้องการรับการแจ้งเตือนเมื่อเราเตอร์สูญเสียพลังงานหรือการเชื่อมต่ออินเทอร์เน็ต สำหรับสิ่งนี้ เราต้องใช้วิดเจ็ตการแจ้งเตือน
ในการตั้งค่าวิดเจ็ต เปิดใช้งาน "การแจ้งเตือนแบบออฟไลน์" ไม่ต้องใช้รหัส แต่เรายังส่งการแจ้งเตือนที่กำหนดเองจากโค้ดของเราได้อีกด้วย
ขั้นตอนที่ 10: การทำงานอัตโนมัติในเบื้องหลัง
สำหรับตอนนี้ สคริปต์จะต้องดำเนินการด้วยตนเอง แต่ฉันต้องการให้มันทำงานในพื้นหลังโดยอัตโนมัติเมื่อเปิดเราเตอร์
ทำได้โดยการสร้างบริการ สร้างไฟล์ /etc/init.d/blynkmon:
#!/bin/sh /etc/rc.common
START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; จากนั้น echo "blynkmon ทำงานแล้ว" exit 0 fi cd /root/lua-blynk lua blynkmon.lua your-auth-token > /dev/null & echo $! > $pidfile } หยุด () { ถ้า [! -f $pidfile]; จากนั้น echo "blynkmon ไม่ทำงาน" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }
หมายเหตุ: อย่าลืมเปลี่ยน your-auth-token
จากนั้นเปิดใช้งานบริการ blynkmon:
บริการ blynkmon เปิดใช้งาน
ขั้นตอนที่ 11: บทสรุปและแนวคิดเพิ่มเติม
คุณสามารถสแกน QR นี้เพื่อรับโคลนของโครงการ Blynk ของฉันได้ ต้องใช้คะแนนพลังงาน (4600) เนื่องจากใช้วิดเจ็ตจำนวนมาก!
ค้นหารหัส Lua แบบเต็มได้ที่นี่:https://gist.github.com/vshymanskyy/3d3388a4e17f44…
จนถึงตอนนี้ดีมาก แต่นี่เป็นแนวคิดบางอย่างที่ฉันต้องการเพิ่มในอนาคตอันใกล้
- เพิ่มคำสั่งรีบูต ป้องกันการคลิกโดยไม่ตั้งใจ
- เพิ่มวิดเจ็ต Terminal เพื่อเรียกใช้คำสั่ง linux
-
เพิ่มแผนภูมิอุณหภูมิ CPU
UPD: น่าเสียดายที่ OpenWrt ยังไม่มีไดรเวอร์บางตัวสำหรับรุ่นเราเตอร์ของฉัน แต่มีให้สำหรับเราเตอร์อื่น ๆ อีกมากมาย
- เพิ่มการแจ้งเตือนเมื่อมีอุปกรณ์เฉพาะเข้าร่วม/ออกจากเครือข่าย เรามีข้อมูล arp แล้ว ให้ตรวจสอบเฉพาะที่อยู่ MAC เท่านั้น
ด้วยวิธีนี้ เราสามารถตรวจสอบและควบคุมเครื่องพิมพ์ 3 มิติ, หุ่นยนต์, พีซี/แล็ปท็อป, Arduino/ESP8266/ESP32/RaspberryPi, อุปกรณ์สมาร์ทโฮม และทุกสิ่งรอบตัว แจ้งให้เราทราบหากมีแนวคิดที่น่าสนใจอื่น ๆ คุณคิดอย่างไรเกี่ยวกับเรื่องนี้?
แนะนำ:
สร้างหุ่นยนต์ควบคุมระยะไกล ESP8266 มูลค่า 15 เหรียญ / รถ / ถังสำหรับ Ios และ Android: 4 ขั้นตอน
สร้างหุ่นยนต์ควบคุมระยะไกล ESP8266 มูลค่า 15 เหรียญ / รถ / ถังสำหรับ Ios และ Android: คุณเกลียดที่จะเดินไปที่ห้องครัวเพื่อซื้อขนมหรือไม่? หรือเพื่อรับเครื่องดื่มใหม่? ทั้งหมดนี้สามารถแก้ไขได้ด้วยบัตเลอร์ที่ควบคุมด้วยรีโมตแบบง่ายๆ มูลค่า 15 เหรียญ ก่อนที่เราจะไปไกลกว่านี้ฉันกำลังดำเนินโครงการ Kickstarter ในขณะนี้สำหรับแถบไฟ LED RGB ที่ควบคุมด้วยเสียง
สร้างเขตปลอดภัยสำหรับอุปกรณ์ Android/IOS/WIN10 เพื่อปลดล็อกอยู่เสมอ: 6 ขั้นตอน
สร้างเขตปลอดภัยสำหรับอุปกรณ์ Android/IOS/WIN10 เพื่อปลดล็อกอยู่เสมอ: ในบทความนี้ เราต้องการสร้างแกดเจ็ตเจ๋งๆ ที่สามารถสร้างโซนปลอดภัยสำหรับปลดล็อกอุปกรณ์ของคุณได้ ในตอนท้ายของโปรเจ็กต์นี้ คุณจะ: เรียนรู้วิธีใช้เซ็นเซอร์ลายนิ้วมือ จะเรียนรู้วิธีจับคู่อุปกรณ์ของคุณกับแกดเจ็ตโซนปลอดภัยของคุณ จะ
แอป 360 VR ใน 10 นาทีด้วยความสามัคคี: 8 ขั้นตอน
แอป 360 VR ใน 10 นาทีด้วยความสามัคคี: เราจะสร้างแอปนี้ได้อย่างไร ซึ่งแตกต่างจากวิดีโอทั่วไปที่มีกรอบสี่เหลี่ยม วิดีโอ 360 มีรูปร่างเป็นทรงกลม ดังนั้น อันดับแรก เราต้องสร้างหน้าจอทรงกลมเพื่อฉายวิดีโอ 360 องศาของเรา ผู้เล่น (หรือผู้ดู) จะอยู่ภายในพื้นที่นี้
Node MCU พร้อมโมดูลรีเลย์ 4 พอร์ต, แอป Blynk, IFTTT และ Google Home กำไร?: 5 ขั้นตอน
Node MCU พร้อมโมดูลรีเลย์ 4 พอร์ต, แอป Blynk, IFTTT และ Google Home กำไร?: โพสต์นี้เป็นข้อมูลเกี่ยวกับวิธีเชื่อมต่อ Google Home กับ NodeMCU และแอป blynk คุณสามารถควบคุมเครื่องใช้ของคุณด้วยสวิตช์ NodeMCU ที่ควบคุม blynk และผู้ช่วยของ Google ได้เลย ตกลง Google .. เปิดสิ่งที่ดี
ควบคุมหุ่นยนต์ Arduino ของคุณจากระยะไกล: 7 ขั้นตอน
ควบคุมหุ่นยนต์ Arduino ของคุณจากระยะไกล: ในคำแนะนำนี้ ฉันจะพูดถึงการใช้ Adafruit Motor Shield สำหรับ Arduino V2 ข้างเสาอากาศ nRF24L01 เพื่อสร้างหุ่นยนต์ควบคุมระยะไกลระยะไกล ฉันใช้ Adafruit Arduino 101 CurrieBot รุ่นเก่ากับ Arduino Uno แทน