バニラカメラ


2021/5/13公開

概要
UnitV AI Cameraを使ってバニラソングを流す謎のマシン、バニラカメラを作りました。
カメラとしての機能は完全に放棄してます。

再生方式について
音声はSDカードに保存した1ビットPCM形式のバイナリファイルをロードして再生用に処理し、ハイスピードGPIOを使って流してます。
再生対象の音声のサンプリングレートは11025Hzとしているので、1サンプル当たり約90.7マイクロ秒で出力すれば良いということになります。
GPIOのパルス持続時間を計測したところ約20マイクロ秒弱だったので、1サンプル分のパルス出力後に74マイクロ秒のウェイトを追加して1サンプルで91マイクロ秒になるように調整しています。

サンプルコード
import time
import utime
import uos

from fpioa_manager import fm
from Maix import GPIO
from modules import ws2812

fm.register(35,fm.fpioa.GPIOHS1, force=True)

# RGB LED Settings
class_ws2812 = ws2812(8,100)
BRIGHTNESS = 0x10

# Blink RGB LED
def BlinkLED(r,g,b):
    class_ws2812.set_led(0,(r,g,b))
    class_ws2812.display()
    time.sleep(0.3)
    class_ws2812.set_led(0,(0,0,0))
    class_ws2812.display()
    time.sleep(0.3)
    class_ws2812.set_led(0,(r,g,b))
    class_ws2812.display()

def toBits(byte):
    bits = []
    for shift in reversed(range(8)):
        bit = byte >> shift & 0x01
        bits.append(bit)
    return bits

for i in range(3):
    BlinkLED(0,0,BRIGHTNESS)

f = open("/sd/vanilla.raw", "rb")

spk = GPIO(GPIO.GPIOHS1, GPIO.OUT)

for item in f.read():
    bits = toBits(item)

    for bit in bits:
        #start = utime.ticks_us()
        spk.value(bit)
        utime.sleep_us(74)
        #end = utime.ticks_us()
        #print(end - start)

class_ws2812.set_led(0,(0,0,0))
class_ws2812.display()


戻る