2026年2月12日 星期四

MicroPython 學習筆記 : ESP32-S3 CAM 開發板鏡頭慢速測試程式

之前買的兩片 ESP32-S3 CAM 開發板的其中一片拍的照片, 前面看來正常, 但後面卻糊掉或變成馬賽克 (燒錄的韌體與使用的拍照的程式均相同), 甚至將解析度降至 QVGA 狀況依舊. 本來懷疑是鏡頭模組問題, 只要將兩片開發板的 ov2640 交換測試即知, 但鏡頭的排線很密很脆弱, 過度曲折可能造成內部電線斷裂, 連接座的間隙也是每拆卸排線一次就變大, 鏡頭裝上去沒必要就盡量不要拆.  






我把以上不良照片上傳給 Gemini 分析, 它認為鏡頭與感光元件 (CMOS) 都沒有壞, 問題可能出在排線 (Ribbon Cable) 或連接座, 因為如果鏡頭破了或感光元件燒了, 畫面會是全黑, 全白, 或是充滿雜訊點, 絕對不會只壞下面. 相機的排線非常脆弱, 輕微的震動都可能導致 D0-D7 數據線接觸不良, 建議將 ov2640 排線拆下來用橡皮擦清潔接點, 清完後用下列 "龜速診斷模式" 測試 : 

import camera
import time
import gc

# 1. 強制回收記憶體
gc.collect()

print("========================================")
print("🚀 Vibe Cam - 龜速診斷模式")
print("========================================")

try:
    # 2. 關閉舊的相機實體
    try:
        camera.deinit()
    except:
        pass
    time.sleep(1.0) # 讓電容放電

    # 3. 初始化:關鍵參數全開
    print("📷 初始化相機 (設定最保守參數)...")
    
    # 嘗試 Freenove 的標準初始化,但強制覆寫頻率
    try:
        # xclk_freq=10000000 (10MHz) -> 讓時脈變慢一半
        camera.init(0, format=camera.JPEG, framesize=camera.FRAME_QVGA, xclk_freq=10000000)
        print("   -> ✅ 頻率已降至 10MHz")
    except:
        print("   -> ⚠️ 韌體不支援降頻參數,使用預設值")
        camera.init()

    # 4. 畫質設定:最差畫質 (High Compression)
    # quality=63 (這是 OV2640 的極限,畫質最爛,但數據量最小)
    try:
        camera.quality(63)
        print("   -> 📉 畫質設定為 63 (最高壓縮/最小檔案)")
    except:
        pass

    # 5. 暖身 (給它多跳幾下)
    print("🔥 暖身中 (連拍 5 張)...")
    time.sleep(2.0)
    for i in range(5):
        try:
            camera.capture()
            time.sleep(0.2)
        except:
            pass

    # 6. 正式拍照
    print("📸 拍攝診斷照片...")
    gc.collect()
    
    buf = camera.capture()

    if buf and len(buf) > 0:
        print(f"📦 取得影像: {len(buf)} bytes")
        
        # 檢查檔案完整性
        valid = False
        if len(buf) > 2 and buf[0] == 0xFF and buf[1] == 0xD8 and buf[-2] == 0xFF and buf[-1] == 0xD9:
            valid = True
            print("   -> ✅ 標頭尾完整 (傳輸成功)")
        else:
            print(f"   -> ❌ 標頭尾殘缺 (傳輸中斷, 結尾: {hex(buf[-1])})")

        filename = "vibe_slow.jpg"
        with open(filename, "wb") as f:
            f.write(buf)
            
        print(f"💾 已儲存: {filename}")
        print("👉 請打開這張圖。如果連這張 QVGA+畫質最爛的照片都還有撕裂,")
        print("   那就代表鏡頭排線真的斷了。")
    else:
        print("❌ 拍照失敗 (無數據)")

    camera.deinit()

except Exception as e:
    print(f"❌ 錯誤: {e}")

但即使以 10MHz 龜速與 QVGA 超低畫質設定去拍, 問題還是一樣 : 




 
我的零件箱應該還有很久以前採購的 ov2640 模組, 等找出來後再測試看看. 上面 Gemini 提供的慢速測試程式留著備用. 

沒有留言 :