バニラカメラ
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()
戻る