ใน Part 1 ได้ตรวจสอบ CM4 Maker Board สำหรับ Raspberry Pi CM4 และบูตด้วยการใส่ “MAKERDISK” microSD card Class A1 ขนาด 32GB ที่มี Raspberry Pi OS ติดตั้งอยู่ล่วงหน้า, สำหรับ Part 2 ของการรีวิว CM4 Maker เราจะใช้ NVMe SSD ขนาด 128GB ของบริษัทที่ให้มา และทดสอบคุณสมบัติอื่น ๆ ของบอร์ดรวมถึง RTC, Buzzer, โมดูล Grove จาก Seeed Studio และเข้า ChatGPT ให้ช่วยเขียนโปรแกรม Python เพื่อนำมาใช้งาน
การบูต Cytron CM4 Maker Board ด้วย “MAKERDISK” NVMe SSD
เริ่มจากเชื่อมต่อโมดูล Grove หลายตัวด้วยอินเทอร์เฟซ GPIO และ I2C, Raspberry Pi Camera Module 3, สาย Ethernet, RF dongle 2 ตัวสำหรับคีย์บอร์ดและเมาส์ไร้สาย, สาย HDMI เข้ากับจอภาพ และจอมอนิเตอร์ และเสียบปลั๊กอะแดปเตอร์ USB-C 5V/3.5A ที่ให้มา
MAKERDISK SSD มาพร้อมกับ Raspberry Pi OS ดังนั้นจึงไม่ต้องแฟลชอิมเมจ และการบูต CM4 Maker Board นั้นง่ายมาก แค่ถอด microSD card ออกและตรวจสอบให้แน่ใจว่าสวิตช์ด้านล่างซ้ายได้ตั้งค่าเป็น RUN เนื่องจากโหมด BOOT ใช้สำหรับโมดูล CM4 ที่มีeMMC flash
เป็นระบบ Plug-and-Play จริงๆ เนื่องจากมีการติดตั้ง Raspberry Pi OS ไว้ล่วงหน้า
ข้อมูลระบบและ SBC Bench
เรามาดูข้อมูลระบบ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
pi@raspberrypi:~ $ sudo inxi -Fc0 System: Host: raspberrypi Kernel: 6.1.21-v8+ aarch64 bits: 32 Console: tty 0 Distro: Raspbian GNU/Linux 11 (bullseye) Machine: Type: ARM Device System: Raspberry Pi Compute Module 4 Rev 1.1 details: BCM2835 rev: c03141 serial: 100000003927104e CPU: Info: Quad Core model: N/A variant: cortex-a72 bits: 64 type: MCP Speed: 1500 MHz min/max: 600/1500 MHz Core speeds (MHz): 1: 1500 2: 1500 3: 1500 4: 1500 Graphics: Device-1: bcm2711-hdmi0 driver: vc4_hdmi v: N/A Device-2: bcm2711-hdmi1 driver: vc4_hdmi v: N/A Device-3: bcm2711-vc5 driver: vc4_drm v: N/A Display: server: X.org 1.20.11 driver: loaded: modesetting unloaded: fbdev tty: 80x24 Message: Advanced graphics data unavailable in console for root. Audio: Device-1: bcm2711-hdmi0 driver: vc4_hdmi Device-2: bcm2711-hdmi1 driver: vc4_hdmi Sound Server: ALSA v: k6.1.21-v8+ Network: Message: No ARM data found for this feature. IF-ID-1: eth0 state: up speed: 1000 Mbps duplex: full mac: e4:5f:01:e4:b8:e5 IF-ID-2: wlan0 state: up mac: e4:5f:01:e4:b8:e6 Drives: Local Storage: total: 119.24 GiB used: 10.31 GiB (8.6%) ID-1: /dev/nvme0n1 model: PCIe SSD size: 119.24 GiB Partition: ID-1: / size: 117.03 GiB used: 10.26 GiB (8.8%) fs: ext4 dev: /dev/nvme0n1p2 ID-2: /boot size: 252 MiB used: 50.2 MiB (19.9%) fs: vfat dev: /dev/nvme0n1p1 Swap: ID-1: swap-1 type: file size: 100 MiB used: 0 KiB (0.0%) file: /var/swap Sensors: System Temperatures: cpu: 56.0 C mobo: N/A Fan Speeds (RPM): N/A Info: Processes: 186 Uptime: 2m Memory: 3.78 GiB used: 583.7 MiB (15.1%) gpu: 76 MiB Init: systemd runlevel: 5 Shell: Bash inxi: 3.3.01 |
ผลลัพธ์กล่าวถึง “Raspberry Pi Compute Module 4” แต่ดูเหมือนผลลัพธ์ที่ได้จาก Raspberry Pi 4 SBC ยกเว้นเรื่องไดรฟ์ NVMe การมีอินเทอร์เฟส PCIe สำหรับ SSD หมายความว่าไม่มีชิป VL805 และเป็นผลให้ไม่มีพอร์ต USB 3.0 มีเพียงพอร์ต USB 2.0 สี่พอร์ตบน CM4 Maker Board
มารัน sbc-bench benchmark scripts เพื่อตรวจสอบปัญหาที่อาจเกิดขึ้น:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
pi@raspberrypi:~/ $ sudo ./sbc-bench.sh -c sbc-bench v0.9.40 Installing needed tools: apt -f -qq -y install sysstat lshw, tinymembench, ramlat, mhz, cpuminer...^Cpi@raspberrypi:~/iozone3_494/src/current $ sudo ./sbc-bench.sh -r Starting to examine hardware/software for review purposes... Average load and/or CPU utilization too high (too much background activity). Waiting... Too busy for benchmarking: 10:49:26 up 17 min, 3 users, load average: 0.96, 0.77, 0.44, cpu: 8% Too busy for benchmarking: 10:49:31 up 17 min, 3 users, load average: 0.96, 0.77, 0.44, cpu: 0% Too busy for benchmarking: 10:49:36 up 17 min, 3 users, load average: 0.88, 0.76, 0.44, cpu: 0% Too busy for benchmarking: 10:49:41 up 17 min, 3 users, load average: 0.81, 0.75, 0.43, cpu: 0% Too busy for benchmarking: 10:49:46 up 17 min, 3 users, load average: 0.83, 0.75, 0.44, cpu: 0% Too busy for benchmarking: 10:49:51 up 17 min, 3 users, load average: 0.76, 0.74, 0.44, cpu: 0% sbc-bench v0.9.40 Installing needed tools: apt -f -qq -y install stress-ng smartmontools mmc-utils, cpuminer. Done. Checking cpufreq OPP. Done. Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Executing 7-zip benchmark. Done. Throttling test: heating up the device, 5 more minutes to wait. Done. Checking cpufreq OPP again. Done (15 minutes elapsed). ./sbc-bench.sh: line 4434: /sys/block/nvme0n1/device/type: No such file or directory Results validation: * Measured clockspeed not lower than advertised max CPU clockspeed * No swapping * Background activity (%system) OK * Throttling / frequency capping occured Full results uploaded to http://ix.io/4sWJ # Raspberry Pi Compute Module 4 Rev 1.1 Tested with sbc-bench v0.9.40 on Sat, 08 Apr 2023 11:08:43 +0700. Full info: [http://ix.io/4sWJ](http://ix.io/4sWJ) ### General information: BCM2711, Kernel: aarch64, Userland: armhf CPU sysfs topology (clusters, cpufreq members, clockspeeds) cpufreq min max CPU cluster policy speed speed core type 0 0 0 600 1500 Cortex-A72 / r0p3 1 0 0 600 1500 Cortex-A72 / r0p3 2 0 0 600 1500 Cortex-A72 / r0p3 3 0 0 600 1500 Cortex-A72 / r0p3 3794 KB available RAM ### Governors/policies (performance vs. idle consumption): Original governor settings: cpufreq-policy0: performance / 1500 MHz (conservative ondemand userspace powersave performance schedutil / 600 700 800 900 1000 1100 1200 1300 1400 1500) Tuned governor settings: cpufreq-policy0: performance / 1500 MHz ### Clockspeeds (idle vs. heated up): Before at 56.5°C: cpu0 (Cortex-A72): OPP: 1500, ThreadX: 1500, Measured: 1498 After at 84.2°C (throttled): cpu0 (Cortex-A72): OPP: 1500, ThreadX: 1500, Measured: 1498 ### Performance baseline * memcpy: 2447.2 MB/s, memchr: 1247.0 MB/s, memset: 2992.8 MB/s * 16M latency: 162.8 162.9 166.1 162.5 164.7 165.3 181.4 194.4 * 128M latency: 184.6 181.5 207.6 183.8 185.0 180.2 204.8 224.4 * 7-zip MIPS (3 consecutive runs): 5672, 5727, 5715 (5700 avg), single-threaded: 1630 * `aes-256-cbc 50486.18k 59697.96k 63357.01k 64378.20k 64714.07k 64618.50k` * `aes-256-cbc 50662.80k 59868.22k 63469.40k 64380.25k 64667.65k 64607.57k` ### Storage devices: * 119.2GB "PCIe SSD" SSD as /dev/nvme0: Speed 5GT/s (downgraded), Width x1 (downgraded), 0% worn out, drive temp: 36°C ### Swap configuration: * /var/swap on /dev/nvme0n1p2: 100.0M (0K used) ### Software versions: * Raspbian GNU/Linux 11 (bullseye) * Build scripts: http://archive.raspberrypi.org/debian/ bullseye main * Compiler: /usr/bin/gcc (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 / arm-linux-gnueabihf * OpenSSL 1.1.1n, built on 15 Mar 2022 * ThreadX: 82f3750a65fadae9a38077e3c2e217ad158c8d54 / Mar 17 2023 10:50:39 ### Kernel info: * `/proc/cmdline: coherent_pool=1M 8250.nr_uarts=0 snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=1 snd_bcm2835.enable_hdmi=0 video=HDMI-A-1:1920x1080M@60 smsc95xx.macaddr=E4:5F:01:E4:B8:E5 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 console=tty1 root=PARTUUID=32d5aead-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles` * Vulnerability Spec store bypass: Vulnerable * Vulnerability Spectre v1: Mitigation; __user pointer sanitization * Vulnerability Spectre v2: Vulnerable * Kernel 6.1.21-v8+ / CONFIG_HZ=250 All known settings adjusted for performance. Device now ready for benchmarking. Once finished stop with [ctrl]-[c] to get info about throttling, frequency cap and too high background activity all potentially invalidating benchmark scores. All changes with storage and PCIe devices as well as suspicious dmesg contents will be reported too. Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore 11:08:48: 1500/1500MHz 2.50 34% 1% 33% 0% 0% 0% 69.6°C 0.8700V |
ผลลัพธ์ดูเหมือนจะตรงตามที่คาดหวัง และเกิดการลดความเร็ว CPU เนื่องจากระบบไม่มีการระบายความร้อน ซึ่งอยู่ในห้องที่มีอุณหภูมิสภาพแวดล้อมประมาณ 29°C นอกจากนี้ยังมีช่องโหว่ Spectre v1/v2…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
System health while running 7-zip multi core benchmark: Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore 10:59:21: 1500/1500MHz 1.05 15% 1% 13% 0% 0% 0% 61.8°C 0.8700V 10:59:41: 1500/1500MHz 1.63 82% 1% 81% 0% 0% 0% 68.2°C 0.8700V 11:00:02: 1500/1500MHz 2.47 94% 2% 92% 0% 0% 0% 71.1°C 0.8700V 11:00:23: 1500/1500MHz 3.32 90% 2% 88% 0% 0% 0% 72.1°C 0.8700V 11:00:42: 1500/1500MHz 3.40 87% 1% 86% 0% 0% 0% 70.1°C 0.8700V 11:01:03: 1500/1500MHz 3.57 92% 1% 90% 0% 0% 0% 74.0°C 0.8700V 11:01:27: 1500/1500MHz 3.70 94% 2% 92% 0% 0% 0% 74.5°C 0.8700V 11:01:48: 1500/1500MHz 3.67 92% 2% 89% 0% 0% 0% 73.5°C 0.8700V 11:02:07: 1500/1500MHz 3.83 84% 2% 82% 0% 0% 0% 74.5°C 0.8700V 11:02:30: 1500/1500MHz 3.66 96% 1% 95% 0% 0% 0% 76.9°C 0.8700V 11:02:49: 1500/1500MHz 4.03 91% 2% 89% 0% 0% 0% 76.4°C 0.8700V 11:03:08: 1500/1500MHz 4.17 93% 3% 89% 0% 0% 0% 76.0°C 0.8700V System health while running cpuminer: Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore 11:03:21: 1500/1500MHz 4.23 24% 1% 22% 0% 0% 0% 80.8°C 0.8700V 11:04:07: 1500/1426MHz 4.19 99% 0% 99% 0% 0% 0% 82.8°C 0.8700V 11:04:53: 1500/1377MHz 4.37 100% 0% 99% 0% 0% 0% 83.8°C 0.8700V 11:05:40: 1500/1377MHz 4.22 100% 0% 99% 0% 0% 0% 84.2°C 0.8700V 11:06:27: 1500/1377MHz 4.21 100% 0% 99% 0% 0% 0% 83.8°C 0.8700V 11:07:13: 1500/1377MHz 4.32 99% 0% 99% 0% 0% 0% 83.8°C 0.8700V 11:08:00: 1500/1329MHz 4.23 100% 0% 99% 0% 0% 0% 84.2°C 0.8700V |
ปัญหาความร้อนสูงเกินไปนั้นไม่ได้เกิดจากการทดสอบด้วยโปรแกรม 7-zip แต่เกิดเฉพาะกับ cpuminer เท่านั้น เนื่องจาก CM4 Maker Board ใช้สำหรับตลาดการศึกษา จึงไม่สำคัญมาก แต่ถ้ามีวัตถุประสงค์ในการใช้งานที่ต้องการความยืดหยุ่นมากขึ้นหรือต้องการ overclock โปรเซสเซอร์ BCM2711 อาจจะต้องซื้อ heatsink ราคา $4.5 (~150฿) สำหรับโมดูล CM4 ซึ่งจะช่วยลดอุณหภูมิได้มาก
NVMe SSD ของ CM4 Maker Board
จุดเด่นอย่างหนึ่งของ CM4 Maker Board คือรองรับ M.2 2242 NVMe SSD แบบสั้น ดังนั้นฉันจึงทดสอบประสิทธิภาพของไดรฟ์ด้วย Build iozone สำหรับ Raspberry Pi :
1 2 3 4 5 6 7 8 9 10 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 63527 101848 93009 93003 41134 96589 102400 16 161396 212032 171558 171222 107160 204687 102400 512 372712 374917 354187 354190 353150 377961 102400 1024 379233 387792 372938 372891 372089 383440 102400 16384 399166 395914 398335 398314 397881 399957 iozone test complete. |
ความเร็วในการอ่านและเขียนตามลำดับเกือบ 400MB/s และ I/O แบบสุ่มก็ไม่ได้แย่เกินไป
ตอนนี้ลองใส่ “MAKERDISK” microSD card Class A1 32GB เพื่อทดสอบกับ iozone:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pi@raspberrypi:/media/pi/rootfs $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 28.9G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /media/pi/bootfs └─mmcblk0p2 179:2 0 28.7G 0 part /media/pi/rootfs nvme0n1 259:0 0 119.2G 0 disk ├─nvme0n1p1 259:1 0 256M 0 part /boot └─nvme0n1p2 259:2 0 119G 0 part / pi@raspberrypi:/media/pi/rootfs $ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 3374 3461 12744 12736 10046 3176 102400 16 11155 11435 24923 24926 22029 11289 102400 512 29045 28593 44127 44161 43848 28540 102400 1024 29408 29014 44220 44322 44155 29083 102400 16384 28205 27217 44405 44529 44516 27626 iozone test complete. |
นั่นเป็นการทดสอบ microSD card ที่ดี แต่ความเร็วในการอ่าน/เขียนต่อเนื่องประมาณ 44MB/s และ I/O แบบสุ่มที่ช้ากว่ามาก โดยเฉพาะอย่างยิ่งสำหรับการเขียนขนาดเล็ก
เพื่อแสดงความแตกต่างในด้านประสิทธิภาพ ฉันได้รีบูทระบบใหม่ และเริ่มต้น Chromium และ LibreOffice Write ด้วย microSD card และ SSD ซึ่ง SSD นั้นเร็วกว่า แต่ฉันคาดหวังถึงความแตกต่างที่มากกว่า LibreOffice ไม่ได้ติดตั้งบน microSD card ดังนั้นจึงติดตั้งด้วย apt และเริ่มทันทีหลังจากนั้น ฉันคิดว่าการแคชระหว่างการติดตั้งจะไม่ส่งผลกระทบต่อการเริ่มต้นแอป แต่ฉันคิดผิด และการแคช LibreOffice Writer จะเริ่มทำงานบน microSD card ได้เร็วกว่าบน SSD โดยไม่ต้องแคช ฉันยังโหลดเว็บไซต์ซอฟต์แวร์ CNX ใน Chromium แต่ไม่ได้แสดงในวิดีโอ เพราะเว็บไซต์ทำได้เร็วกว่าด้วย microSD card เนื่องจากใช้เวลานานกว่าในการโหลดข้อมูลจากอินเทอร์เน็ตด้วยอิมเมจ SSD โดยไม่ขึ้นกับความเร็วในการจัดเก็บ … (ฉันต้องรีเฟรชหน้านี้เพราะโหลดไม่ได้)
โดยรวมแล้ว ระบบจะทำงานด้วย SSD ได้รวดเร็วกว่า microSD card แต่ความแตกต่างอาจไม่เป็นตามที่คาดหวังไว้ ความแตกต่างในประสิทธิภาพควรจะมีค่ามากขึ้นสำหรับแอปพลิเคชันที่เขียนข้อมูลจำนวนเล็กน้อยลงในไดรฟ์
คุณสมบัติในตัวบอร์ด CM4 Maker
PCF85063A RTC
บอร์ด CM4 Maker มีคุณสมบัติต่างๆ ที่น่าสนใจ และเราเริ่มต้นด้วย RTC (ไม่มีแบตเตอรี่) คำแนะนำสามารถดูได้บน Wiki แต่เราได้รับคำแนะนำเพียงการใช้คำสั่ง hwclock utility และ “หมายเหตุ DSI และ CSI ถูกห้ามใช้เมื่อใช้ RTC I2C-10 เป็นค่าเริ่มต้น”
ดังนั้นเราจึงต้องเปิดใช้งาน I2C ก่อน โดยใช้คำสั่ง raspi-config ใน terminal หรือสามารถทำได้ในเมนู Settings บน desktop
หลังจากที่รีบูทระบบใหม่ ยังไม่สามารถใช้ RTC ได้:
1 2 3 |
pi@raspberrypi:~ $ sudo hwclock -r hwclock: Cannot access the Hardware Clock via any known method. hwclock: Use the --verbose option to see the details of our search for an access method. |
ต้องเพิ่มบรรทัดต่อไปนี้ใน /boot/config.txt:
1 |
dtoverlay=i2c-rtc,pcf85063a,i2c_csi_dsi |
รีบูทระบบอีกครั้งและตรวจพบ PCF85063A RTC ใน kernel log :
1 2 3 |
pi@raspberrypi:~ $ dmesg | grep pcf [ 7.155444] rtc-pcf85063 10-0051: registered as rtc0 [ 7.160928] rtc-pcf85063 10-0051: hctosys: unable to read the hardware clock |
ฉันสามารถอ่านค่าเวลาจาก RTC:
1 2 |
pi@raspberrypi:~ $ sudo hwclock -r 2023-04-08 14:26:42.962612+07:00 |
ซิงโครไนซ์เวลานาฬิกาของระบบกับนาฬิกาของฮาร์ดแวร์:
1 |
pi@raspberrypi:~ $ sudo hwclock -w |
ซิงโครไนซ์เวลานาฬิกาฮาร์ดแวร์กับนาฬิการะบบ:
1 |
pi@raspberrypi:~ $ sudo hwclock -s |
วิกิมีคำแนะนำเพิ่มเติมในการแสดงเวลาบนจอแสดงผล I2C OLED
ปุ่ม Buzzer & user buttons
แผนต่อไปของฉันคือ ทดสอบ Buzzer แต่ Cytron ให้โปรแกรม Python สำหรับ ปุ่ม Buzzer และ User buttons (ปุ่มอเนกประสงค์โปรแกรมได้) 3 ปุ่ม บนบอร์ด นั่นทำให้ฉันมีโอกาสทดสอบทั้งสองอย่าง
สามารถหาโค้ดตัวอย่าง Python ทั้งหมดบน Github:
1 |
git clone https://github.com/CytronTechnologies/Getting-Started-with-CM4-Maker-Board/ |
สามารถทดสอบปุ่ม Buzzer และปุ่มต่างๆ ด้วย Lesson 2/buzzer_button.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import RPi.GPIO as GPIO import time import math buttonPin1 = 17 #Define the button pins buttonPin2 = 22 buttonPin3 = 27 buzzerPin = 19 #Define the buzzer pin GPIO.setwarnings(False) #Disable warnings (optional) GPIO.setmode(GPIO.BCM) #Number GPIOs by Broadcom Chip GPIO.setup(buzzerPin, GPIO.OUT) #Set buzzerPin's mode as output GPIO.setup(buttonPin1, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set pin to be an input pin and set initial value to be pulled high GPIO.setup(buttonPin2, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(buttonPin3, GPIO.IN, pull_up_down=GPIO.PUD_UP) p = GPIO.PWM(buzzerPin, 1) p.start(0); def tone1(): p.start(50) for x in range(0,361): #Frequency of the tone along the sine wave sinVal = math.sin(x * (math.pi / 180.0)) #Calculate the sine value toneVal = 2000 + sinVal * 500 #Add to the resonant frequency with a Weighted p.ChangeFrequency(toneVal) #Output PWM time.sleep(0.001) def tone2(): p.start(50) for x in range(0,361): sinVal = math.sin(x * (math.pi / 180.0)) toneVal = 1000 + sinVal * 500 p.ChangeFrequency(toneVal) time.sleep(0.001) def tone3(): p.start(50) for x in range(0,361): sinVal = math.sin(x * (math.pi / 180.0)) toneVal = 3000 + sinVal * 800 p.ChangeFrequency(toneVal) time.sleep(0.001) def stopTone(): p.stop() while True: # Run forever if GPIO.input(buttonPin1) == GPIO.LOW: print("Button #17 was pushed!") tone1() elif GPIO.input(buttonPin2) == GPIO.LOW: print("Button #22 was pushed!") tone2() elif GPIO.input(buttonPin3) == GPIO.LOW: print("Button #27 was pushed!") tone3() else: stopTone() |
เพียงกดปุ่มค้างไว้ เราก็จะได้ยินเสียงตามที่เรากำหนดไว้
1 2 3 4 |
pi@raspberrypi:~/Getting-Started-with-CM4-Maker-Board/Lesson 2 $ python buzzer_button.py Button #17 was pushed! Button #27 was pushed! Button #27 was pushed! |
GPIO LEDs
CM4 Maker Board มาพร้อมกับไฟ LED แสดงสถานะ GPIO 10 ดวง แต่ยังไม่ได้ Debug program
ดังนั้นฉันจึงเขียนโปรแกรม Python เพื่อเปิดไฟ LED แต่ละดวงแล้วปิดทีละดวงตามลำดับย้อนกลับ (reverse):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import RPi.GPIO as GPIO import time gpios = [2, 3, 5, 6, 12, 13, 14, 15, 23, 24] GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme for x in gpios: GPIO.setup(x, GPIO.OUT) # LED pin set as output while 1: for i in gpios: GPIO.output(i, GPIO.HIGH) time.sleep(0.5) time.sleep(1) gpios.reverse() for i in gpios: GPIO.output(i, GPIO.LOW) time.sleep(0.5) gpios.reverse() time.sleep (1) |
ทั้งหมดทำได้ดี
พอร์ตขยาย CM4 Maker Board และ ChatGPT
CM4 Maker มีตัวเชื่อมต่อ Grove จำนวน 5 พอร์ต, พอร์ต Maker จำนวน 1 พอร์ต ฉันไม่มีโมดูลสำหรับพอร์ต Maker, ฉันใช้ชุด Wio Link Starter Kit บางอันที่ฉันตรวจสอบเมื่อหลายปี เพื่อเชื่อมต่อพอร์ต Grove
เริ่มต้นด้วยเซ็นเซอร์อุณหภูมิและความชื้น DHT11 ที่เชื่อมต่อกับตัวเชื่อมต่อ GPIO Grove
เราจะต้องติดตั้ง Dependencies ก่อน:
1 2 |
pip3 install adafruit-circuitpython-dht sudo apt-get install libgpiod2 |
จากนั้นใช้ตัวอย่างของ DHT11 จาก GitHub repo ของ Cytron (Lesson 1) และเพียงแค่เปลี่ยน GPIO จาก 2 (สำหรับพอร์ต Maker) เป็น 24 จากพอร์ตดิจิทัลดิจิทัล Grove ตัวที่สองบนบอร์ด:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import time import board import adafruit_dht import psutil # We first check if a libgpiod process is running. If yes, we kill it! for proc in psutil.process_iter(): if proc.name() == 'libgpiod_pulsein' or proc.name() == 'libgpiod_pulsei': proc.kill() sensor = adafruit_dht.DHT11(board.D24) while True: try: temp = sensor.temperature humidity = sensor.humidity print("Temperature: {}*C Humidity: {}% ".format(temp, humidity)) except RuntimeError as error: print(error.args[0]) # comment this line to disable the error messages time.sleep(2.0) continue except Exception as error: sensor.exit() raise error time.sleep(2.0) |
และมันทำงานได้อย่างดี แต่มีข้อผิดพลาดบ้างบางครั้ง
1 2 3 4 5 6 7 8 9 |
pi@raspberrypi:~/Getting-Started-with-CM4-Maker-Board/Lesson 1 $ python dht11_sensor.py A full buffer was not returned. Try again. Temperature: 31*C Humidity: 28% Temperature: 31*C Humidity: 27% Temperature: 31*C Humidity: 27% Temperature: 31*C Humidity: 27% Temperature: 31*C Humidity: 27% Checksum did not validate. Try again. Temperature: 31*C Humidity: 27% |
จากนั้นฉันทดสอบโมดูล Grove I2C accelerator ของ Seeed Studio ที่เชื่อมต่อกับพอร์ต Grove I2C ที่มีพอร์ตเดียวบนบอร์ด
“ฉัน” เขียนโค้ดเพื่อทดสอบตัวเชื่อมต่อ Grove I2C ด้วย MMA7660 วัดความเร่ง 3 แกน (3-axis accelerometer):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import smbus import time # Define the I2C address of the accelerometer ACCEL_ADDR = 0x4c # Initialize the I2C bus bus = smbus.SMBus(1) # Start measurement bus.write_byte_data(ACCEL_ADDR, 0x07, 0x01) while True: # Read the acceleration values for each axis try: accel_x = bus.read_byte_data(ACCEL_ADDR, 0x00) accel_y = bus.read_byte_data(ACCEL_ADDR, 0x01) accel_z = bus.read_byte_data(ACCEL_ADDR, 0x02) except OSError as e: print("Error reading accelerometer data: {}".format(e)) accel_x, accel_y, accel_z = 0, 0, 0 # Convert the raw values to G-forces accel_x_g = (accel_x & 0x3F) * 0.047 # 47 mg/LSB if (accel_x & 0x40): accel_x_g -= 2.048 # 2 g offset accel_y_g = (accel_y & 0x3F) * 0.047 if (accel_y & 0x40): accel_y_g -= 2.048 accel_z_g = (accel_z & 0x3F) * 0.047 if (accel_z & 0x40): accel_z_g -= 2.048 # Print the acceleration values print("Acceleration (g): X={:.2f}, Y={:.2f}, Z={:.2f}".format(accel_x_g, accel_y_g, accel_z_g)) # Wait for 1 second time.sleep(1) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pi@raspberrypi:~ $ python accel-loop.py Acceleration (g): X=0.00, Y=0.00, Z=0.00 Acceleration (g): X=0.52, Y=2.63, Z=2.02 Acceleration (g): X=1.08, Y=0.23, Z=2.21 Acceleration (g): X=0.99, Y=2.21, Z=2.40 Acceleration (g): X=2.68, Y=1.18, Z=2.87 Acceleration (g): X=0.70, Y=0.00, Z=2.12 Acceleration (g): X=0.56, Y=2.58, Z=2.07 Acceleration (g): X=0.52, Y=0.05, Z=2.40 Acceleration (g): X=2.96, Y=2.02, Z=2.77 Acceleration (g): X=2.91, Y=1.97, Z=0.00 Acceleration (g): X=2.87, Y=1.93, Z=2.91 Acceleration (g): X=0.05, Y=1.97, Z=2.96 Acceleration (g): X=2.91, Y=2.07, Z=0.28 Acceleration (g): X=0.23, Y=2.21, Z=2.26 ^CTraceback (most recent call last): File "/home/pi/accel-loop.py", line 38, in <module> time.sleep(1) KeyboardInterrupt |
แต่ที่จริงแล้ว ฉันไม่ได้เขียนโค้ดนี้ด้วยตัวเอง ฉันใช้ ChatGPT ช่วยในการเขียนโค้ด ฉันถาม-ตอบ 4 ครั้งกับ AI chatbot และได้โค้ดที่สามารถใช้งานได้โดยไม่มีการแก้ไขใดๆ
สิ่งที่ฉันเขียนใน ChatGPT
- Write Python code for a 3-axis Grove I2C accelerometer connected to a custom Raspberry Pi CM4 board
- Will this work with MMA7660 accelerometer?
- Can you add some debugging code since the code will only return 0
- Not sure why, but it works now. I’d like to measure acceleration data in a loop every second
ในครั้งแรกที่โปรแกรมเอาต์พุตโค้ดสำหรับ accelerometer โดยใช้ address: 0x53 I2C แต่ i2cdetect ไม่พบอุปกรณ์ใดๆ ที่ใช้address: 0x53 เลย มีเพียงอุปกรณ์เดียวที่ใช้ address: 0x4c เท่านั้น ฉันต้องค้นหาว่า Grove accelerometer ใช้ชิป MMA7660 แทน จากนั้นคำถามต่อไปคือโค้ดจะทำงานครั้งเดียวและแสดงผลเป็น 0,0,0 ฉันจึงขอ ChatGPT เพิ่มโค้ดดีบักเพื่อแก้ปัญหา และมันทำงานได้ สุดท้ายฉียขอ ChatGPT เขียนโค้ดเพื่ออ่านข้อมูลทุกวินาที แล้วคัดลอกและวางโค้ด ก็สามารถใช้งานได้เลย ChatGPT เป็นเครื่องมือที่มีประสิทธิภาพอย่างมาก
การทดสอบอินเทอร์เฟส Raspberry Pi 4
บอร์ด Cytron CM4 Maker Board มาพร้อมกับอินเทอร์เฟสเหมือนกับบอร์ด Raspberry Pi 4 ดังนั้นฉันจึงต้องทดสอบให้แน่ใจว่าได้ทำงานตามที่คาดไว้ เราได้เห็นพอร์ต USB 2.0 และพอร์ต HDMI ใช้งานได้แล้ว ดังนั้นฉันจะทดสอบคอนเนกเตอร์กล้อง, Gigabit Ethernet และ audio jack
โมดูลกล้อง Raspberry Pi 3
ทำตามคำแนะนำจากรีวิว Raspberry Pi Camera Module 3 ฉันลองเรียกดูกล้อง:
1 2 |
pi@raspberrypi:~ $ libcamera-hello --list-camera No cameras available! |
แต่ไม่ได้ ฉันลองปิดใช้งาน RTC และตรวจสอบอีกครั้งว่าเสียบสายแพถูกต้องแล้ว แต่ก็ยังไม่ได้ผล ฉันไม่ได้อัปเดตเฟิร์มแวร์เนื่องจากเป็นวันที่ตั้งแต่เดือนมีนาคม 2023 โมดูลกล้อง 3 ควรใช้งานได้ทันที แต่ Cytron บอกว่าติดตั้ง blob ใน Wiki…
1 |
sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-cam1.bin -O /boot/dt-blob.bin |
และหลังจากรีบูทระบบ ก็สามารถตรวจเจอกล้องได้
1 2 3 4 5 6 7 |
pi@raspberrypi:~ $ libcamera-hello --list-camera Available cameras ----------------- 0 : imx708 [4608x2592] (/base/soc/i2c0mux/i2c@1/imx708@1a) Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop] 2304x1296 [56.03 fps - (0, 0)/4608x2592 crop] 4608x2592 [14.35 fps - (0, 0)/4608x2592 crop] |
และฉันก็สามารถใช้กล้องได้ตามปกติ
ฉันยังทดสอบ RTC ขณะรันตัวอย่าง libcamera-hello preview window ฉันไม่พบปัญหาเมื่ออ่านวันที่จาก RTC ไม่มีอาการผิดปกติหรือข้อผิดพลาดกับกล้อง::
Cytronกำลังใช้เครื่องมือกล้องแบบเก่าเช่น เช่น raspistill และ raspivid และนั่นอาจเป็นสาเหตุที่ทำให้มีปัญหา…
Gigabit Ethernet
การตรวจสอบอย่างรวดเร็วแสดงให้เห็นว่า Gigabit Ethernet ทำงานได้ดีแม้ในโหมด full-duplex:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
jaufranc@cnx-laptop-4:~$ iperf3 -t 60 -c 192.168.31.93 -i 10 --bidir Connecting to host 192.168.31.93, port 5201 [ 5] local 192.168.31.86 port 54936 connected to 192.168.31.93 port 5201 [ 7] local 192.168.31.86 port 54938 connected to 192.168.31.93 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd [ 5][TX-C] 0.00-10.00 sec 1.09 GBytes 933 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 0.00-10.00 sec 939 MBytes 788 Mbits/sec [ 5][TX-C] 10.00-20.00 sec 1.09 GBytes 934 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 10.00-20.00 sec 964 MBytes 809 Mbits/sec [ 5][TX-C] 20.00-30.00 sec 1.09 GBytes 934 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 20.00-30.00 sec 968 MBytes 812 Mbits/sec [ 5][TX-C] 30.00-40.00 sec 1.09 GBytes 933 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 30.00-40.00 sec 958 MBytes 804 Mbits/sec [ 5][TX-C] 40.00-50.00 sec 1.09 GBytes 934 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 40.00-50.00 sec 961 MBytes 807 Mbits/sec [ 5][TX-C] 50.00-60.00 sec 1.09 GBytes 933 Mbits/sec 0 1.31 MBytes [ 7][RX-C] 50.00-60.00 sec 968 MBytes 812 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.00 sec 6.52 GBytes 934 Mbits/sec 0 sender [ 5][TX-C] 0.00-60.04 sec 6.52 GBytes 933 Mbits/sec receiver [ 7][RX-C] 0.00-60.00 sec 5.63 GBytes 806 Mbits/sec 0 sender [ 7][RX-C] 0.00-60.04 sec 5.62 GBytes 805 Mbits/sec receiver iperf Done. |
Audio jack
เป็นการทดสอบขั้นสุดท้าย คือการเชื่อมต่อแจ็คเสียง 3.5 มม. เข้ากับลำโพงที่ขับเคลื่อนโดยหนึ่งในพอร์ต USB จากบอร์ด
แต่มันไม่ได้ผล มีเพียง HDMI เท่านั้นที่แสดงบนเดสก์ท็อป (คลิกขวาที่ไอคอนระดับเสียง) และ raspi-config ไม่มีตัวเลือก “หูฟัง”ในการตั้งค่าเสียง:
ฉันไม่พบวิธีแก้ปัญหาที่ชัดเจน แต่ฉันได้ถามแล้ว และหวังว่า Cytron จะอธิบายวิธีการทำงานนั้น และฉันจะอัปเดตโพสต์ต่อไป
อัปเดต: ต้องแก้ไขไฟล์/boot/config.txt ด้วยบรรทัดต่อไปนี้เพื่อให้แจ็คเสียงทำงานได้:
1 |
dtoverlay=audremap,pins_18_19 |
หลังจากรีบูท เราสามารถหา “AV Jack” ได้โดยการคลิกขวาที่ไอคอนระดับเสียง หรือใน raspi-config:
ไม่สามารถเล่นเสียงผ่าน HDMI ได้ แต่สามารถเล่นวิดีโอ YouTube ให้มีเสียงออกทางลำโพงที่ต่อกับแจ็คเสียง 3.5 มม.
Cytron ได้บอกว่า datasheet อยู่ใน Google Docs ที่ไม่แสดงในการค้นหาเว็บ… และยังมีสคริปต์ที่จะทำการ แก้ไข /boot/config.txt โดยอัตโนมัติ ตามที่ได้ตรวจสอบด้านบน
1 |
curl -L tinyurl.com/setup-maker-cm4 | sudo bash |
สรุป
การรีวิว CM4 Maker Board ของ Cytron สนุกดี ซึ่งเหมาะสำหรับสำหรับการศึกษาเรียนรู้, การสร้างต้นแบบด้วยตัวเลือกการขยาย หรือการดีบัก นำเสนอระบบที่รวดเร็วกว่า Raspberry Pi 4 ด้วยการรองรับ NVMe SSD ฉันยังชอบที่บริษัทขายMAKERDISK drives ที่โหลด Raspberry Pi OS ไว้ล่วงหน้า เพื่อประหยัดเวลา
มีคนถามฉันว่าสามารถใช้แทน Raspberry Pi 4 ได้หรือไม่ และฉันคิดว่าสามารถทำได้ เนื่องจากทุกอย่างส่วนใหญ่ทำงานเหมือนกัน แต่ถ้าต้องการเวิร์กโหลดปริมาณมาก ต้องใช้ heatsinkสำหรับโมดูล Raspberry Pi CM4 เพื่อป้องกัน prevent any throttling หมายเหตุแต่ไม่มีพอร์ต USB 3.0 ถ้าคุณต้องการใช้บอร์ดนี้อาจไม่เหมาะ
ฉันขอขอบคุณ Cytron ที่ส่งตัวอย่างเพื่อรีวิว ชุดคิทที่ใช้ในการรีวิวนี้ “CM4 Maker Board + CM4W4L + MD NVMe 2242 128 GB + Accessories” (ไม่รวม microSD card) ขายราคา 5.366.61฿ ถ้าต้องการเพียงบอร์ด CM4 Maker Board เท่านั้น ราคา 1,533.13฿ และถ้าต้องการ CM4 heatsink ราคา 156฿
แปลจากบทความภาษาอังกฤษ : Cytron CM4 Maker Board review – Part 2: NVMe SSD, RTC, Buzzer, Grove modules, ChatGPT…
บรรณาธิการข่าวและบทความภาษาไทย CNX Software ได้มีความสนใจในด้านเทคโนโลยี โดยเฉพาะ Smart Home และ IoT