Raspberry Pi 3B + получает статический шум на 3,5 мм разъеме по событию GPIO - PullRequest
1 голос
/ 03 мая 2019

У меня мало опыта работы с Raspberry Pi и Python, но мне удалось интегрировать решение для системы, которая реагирует, когда люди присутствуют (с PIR-датчиком), и, основываясь на количестве людей, она передает изменения скорости перистальтики. насос, управляемый Arduino (связь осуществляется через Bluetooth с использованием HC-06).

Работа, выполняемая RPi, заключается в получении события с помощью ИК-датчика, подсчете людей, использующих камеру, отправке команды BT и воспроизведении или изменении звуковой дорожки.

Проблема, которую я только что получил, - это статический звук в гнезде 3,5 мм во время воспроизведения звука.

Вещи, которые я уже проверил: + Динамики и подключения нормально работают с другими устройствами + GPIO хорошо связаны и изолированы + Аудиосистема прекрасно играет вне программы + Добавлены "pwm_mode = 2" и "disable_audio_dither = 1" в config.txt

Raspberry Pi 3B + работает на NOOBS, OpenCV и Python 3 на virtualenv Код:

from picamera import PiCamera
from time import sleep
from threading import Timer
from random import randint
import numpy as np
import imutils
import RPi.GPIO as GPIO
import serial
import cv2
import pygame


pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=4096)

pir = 4
crowd = 0
last = 0
lv = 1
waiting = True
state = False
active = False

GPIO.setmode(GPIO.BCM)
GPIO.setup(pir, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

camera = PiCamera()
camera.resolution = (640, 480)

intro = pygame.mixer.Sound('./audio/0.wav')
first = pygame.mixer.Sound('./audio/1.wav')
second = pygame.mixer.Sound('./audio/2.wav')
third = pygame.mixer.Sound('./audio/3.wav')
outro = pygame.mixer.Sound('./audio/m1.wav')

btSerial = serial.Serial( "/dev/rfcomm0", baudrate=9600 )
sleep(2)

hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

def shot(channel):
    global waiting
    print(channel)
    waiting = False
    t.cancel()
    k.cancel()
    camera.start_preview()
    sleep(2)
    camera.capture('/home/pi/Desktop/crowd.bmp')
    camera.stop_preview()
    print ('Photo captured')
    people_counter()
    if not active:
            start()
    else:
        update()

def deactiv():
    global active
    global last
    active = False
    intro.fadeout(8200)
    first.fadeout(8200)
    second.fadeout(8200)
    third.fadeout(8200)
    outro.play(0,10000,6500)
    last = 0
    send_bt('OFF')

def keep_on():
    send_bt('READY')

def people_counter():
    global crowd
    image = cv2.imread('crowd.bmp')
    image = imutils.resize(image, width=min(400, image.shape[1]))
    (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4),
        padding=(16, 16), scale=1.003)
    crowd = len(rects)
    print(crowd)

def start():
    global active
    active = True
    intro.play(0,-1, 6500)
    send_bt('TRIG')

def update():
    global last
    global lv
    if 0 <= crowd <= 2 :
        lv = 1
    elif 2 < crowd <= 5 :
        lv = 2
    elif crowd >= 5 :
        lv = 3
    if lv == last and last != 3:
        pass
    else:
        if lv == 1:
            intro.fadeout(8200)
            first.fadeout(8200)
            second.fadeout(8200)
            third.fadeout(8200)
            first.play(-1,-1,6500)
            send_bt('SET:50')
        elif lv == 2:
            intro.fadeout(8200)
            first.fadeout(8200)
            second.fadeout(8200)
            third.fadeout(8200)
            second.play(-1,-1,6500)
            send_bt('SET:160')
        elif lv == 3:
            if last != 3:
                intro.fadeout(8200)
                first.fadeout(8200)
                second.fadeout(8200)
                third.fadeout(8200)
                third.play(-1,-1,6500)
            n_sp = randint(200, 350)
            send_bt('SET:'+str(n_sp))
        last = lv

def send_bt(pump_com):
    print('sending'+pump_com)
    btSerial.write(pump_com.encode())
    #Wait "Done!"

send_bt('READY')
t = Timer(180, deactiv)
k = Timer(30, keep_on)
GPIO.add_event_detect(pir, GPIO.RISING, shot)
while True:
        state = GPIO.input(pir)
        if active and not state:
                if not waiting:
                        t = Timer(180, deactiv)
                        t.start()
                        waiting = True
                elif flag:
                        k = Timer(30, keep_on)
                        k.start()
                        flag = False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...