Índice:

Um sensor de cor falante, baseado no kit de voz AIY: 4 etapas
Um sensor de cor falante, baseado no kit de voz AIY: 4 etapas

Vídeo: Um sensor de cor falante, baseado no kit de voz AIY: 4 etapas

Vídeo: Um sensor de cor falante, baseado no kit de voz AIY: 4 etapas
Vídeo: What’s New in Google’s IoT Platform? Ubiquitous Computing at Google (Google I/O '17) 2024, Novembro
Anonim
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY
Um sensor de cor falante, baseado no kit de voz AIY

Tendo aprendido um pouco sobre Braille recentemente, eu queria saber se eu poderia construir algo usando o kit de voz AIY para o Raspberry Pi, que pode ter um benefício real ao vivo para os deficientes visuais. Assim descrito a seguir, você encontrará um protótipo de um dispositivo de detecção de cores simples que lê suas descobertas em voz alta.

Uma versão mais elaborada deste sistema pode ser útil para pessoas com deficiência visual ou daltonismo.

O sistema está usando um Raspberry Pi com um HAT de voz AIY conectado. Uma interrupção do sensor TCS34725 RGB é conectada à porta I2C do HAT. O breakout contém um LED branco quente brilhante para iluminar o objeto a ser analisado. O breakout foi colocado em um alojamento para otimizar e padronizar as condições de medição.

O sensor de três cores mede aproximadamente as mesmas três faixas de frequência que os sensores de cores em seus olhos. Em seguida, os valores de vermelho, verde e azul (RGB) são usados para calcular a impressão geral da cor.

A coisa boa sobre este sistema especial é que agora ele informa a cor verbalmente, usando o comando "dizer" dos kits de voz AIY. Por favor, dê uma olhada no vídeo que acompanha.

O dispositivo também pode ser útil como um exemplo para um dispositivo sensor I2C conectado ao HAT de voz AIY.

Etapa 1: Materiais Usados

Raspberry Pi 3. ~ 35 US $ ou EUR

Kit de voz AIY, com cabeçalhos soldados ao HAT. ~ 25US $ ou EUR

Quebra de Adafruit TCS34725, com um cabeçalho soldado. ~ 8 US $ ou EUR

Cabos de jumpers.

Uma placa de ensaio (opcional)

Para a caixa do sensor: - uma cápsula de café "Dolce Gusto" usada - uma pequena peça redonda de 2 mm Forex (placa de espuma de PVC), com cerca de 37 mm de diâmetro - um material preto não refletivo para cobrir as paredes internas da caixa. Usei espuma de borracha preta autoadesiva.

Opcional: um pequeno interruptor para evocar as medições

Algumas gotas de cola plástica e um estilete.

Etapa 2: Montagem e uso

Montagem e Uso
Montagem e Uso
Montagem e Uso
Montagem e Uso
Montagem e Uso
Montagem e Uso

O Raspberry Pi com o HAT de voz AIY foi configurado conforme descrito no manual do AIY. Antes da montagem, os cabeçalhos foram soldados às portas do HAT. Para o alojamento do sensor, uma cápsula de café "Dulce Gusto" foi esvaziada, limpa e uma parte do fundo removida cuidadosamente com uma faca. Você pode usar outra coisa para esse fim, a cápsula de café tinha apenas o tamanho e a forma corretos. Uma peça redonda de 2mm de Forex foi cortada de uma placa, o breakout foi então colocado centralmente na placa Forex, a posição marcada com uma caneta de feltro e uma ranhura para o cabeçalho no breakout foi cortada na posição apropriada.

Agora, a peça Forex foi colada na caixa e o sensor de fuga preso à placa Forex, usando uma tira de velcro. Em seguida, as paredes internas foram cobertas com um material preto absorvente de luz, usei uma espuma de borracha autoadesiva. O papelão preto também deve funcionar. Agora, usando cabos de jumper, a porta I2C "3.3 V" do HAT foi conectada a "V in" no sensor, Ground to Gnd, sda para sda e scl para scl. Eu usei uma placa de ensaio para conectar as duas partes, mas isso não é necessário.

Coloque o script python AIY_TCS34725 na pasta src e execute o script a partir do terminal dev, digitando "sec / AIY_TCS34752.py". Você pode ter que tornar o script Python executável primeiro. Quando solicitado, coloque a unidade sensora sobre o objeto a ser medido, pressione o botão no dispositivo AIY e aguarde um ou dois segundos.

Então, com base nos valores de RGB e branco medidos, o dispositivo primeiro calcula o valor de matiz correspondente, então estima a cor com base neste valor e os comunica verbalmente através do sistema de voz AIY, e. g. como "vermelho escuro", mas também fornece o valor do matiz. Os valores RGB, matiz e brilho (claridade, para ser exato) também são impressos na tela.

Para simplificar o processo de anotação de cores, os valores RGB são transformados no formato HSV (matiz, saturação, valor). Isso permite anotar uma cor em um determinado intervalo de ângulos (ou seja, uma fatia de pizza) e escolher a cor com base no valor de matiz calculado.

Você precisa normalizar seu dispositivo contra uma referência branca e preta. Apenas meça os pedaços de papel mais brancos e pretos que você tiver disponível, faça uma medição em cada um e coloque esses valores como valores máximo e mínimo no código. Apenas os valores de referência ideais fornecerão um bom reconhecimento de cores.

Um problema básico é a reflexão. Se você tiver um objeto com superfície brilhante ou polida, ele refletirá grande parte da luz emitida pelo LED, parecendo muito mais claro do que realmente é. Você pode usar uma folha de membrana para espalhar a luz, mas pode ser necessário implementar um fator de correção.

No caso de objetos translúcidos, pode ser útil colocá-los em um papel branco, caso contrário, a quantidade de luz refletida será muito pequena e o objeto relatado como "preto".

Se você deseja medir a cor de objetos que emitem luz, você deve desligar o LED no breakout conectando a porta "LED" no breakout ao "Ground". Agora defina os valores de normalização de acordo.

Outro problema geral é a iluminação do objeto. O LED branco quente no breakout emite um espectro de luz não contínuo. Portanto, certas cores podem ser super ou sub-representadas no espectro RGB. Para obter mais informações sobre este tópico, dê uma olhada em meus instrutíveis anteriores em colorímetros / fotômetros e espectrômetros:

www.instructables.com/id/An-Inexpensive-Ph…

www.instructables.com/id/A-Mimimal-Six-Col…

Etapa 3: O Código

O código
O código

O código é uma combinação de uma modificação de um código do manual de voz AIY e o código do sensor TCS34725 de Bradspi.

Eu também tentei usar o código TCS34725 python da Adafruit, mas tive problemas ao executar este e alguns outros códigos que estão usando bibliotecas externas em combinação com o AIY HAT. Qualquer ajuda bem-vinda.

Conforme mencionado antes, a anotação de cor é baseada em uma transformação nos valores RGB para matiz. Você deve definir as configurações de normalização com base em medições experimentais de materiais de reverência branco e preto. Preencha os valores absolutos para R, G e B min ou max de acordo.

O script usa uma nova versão do comando "dizer" que permite regular o volume e o tom. Nesse caso, você pode ter que atualizar os arquivos de driver audio.py e tty ou excluir as "partes de volume e pitch" do script.

#! / usr / bin / env python3 # Este script é uma adaptação do script servo_demo.py para o HAT de voz AIY, # otimizado para o reconhecimento de cores usando o Afafruit TCS34725 breakout import aiy.audio import aiy.cloudspeech import aiy.voicehat #from gpiozero import LED # pode ser útil para um LED externo na porta servo #from gpiozero import Button # pode ser útil para um botão externo na servo-porta import time import smbus bus = smbus. SMBus (1) import colorsys def hue2color (matiz): # interpretação de cor com base nos valores de matiz calculados se ((matiz> 12) e (matiz 25) e (matiz 69) e (matiz 164) e (matiz 194) e (matiz 269) e (matiz 319) ou (matiz <20)): cor = "vermelho" retornar cor else: imprimir ("algo deu errado")

def tcs34725 (): # medição e interpretação.

# A medição é realizada pelo script Bradspi TCS34725: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte (0x29, 0x80 | 0x12) ver = bus.read_byte (0x29) # versão # deve ser 0x44 se ver == 0x44: print ("Dispositivo encontrado / n") bus.write_byte (0x29, 0x80 | 0x00) # 0x00 = ENABLE register bus.write_byte (0x29, 0x01 | 0x02) # 0x01 = Power on, 0x02 Sensores RGB habilitados bus.write_byte (0x29, 0x80 | 0x14) # Os resultados da leitura iniciam o registro 14, LSB, em seguida, dados MSB = bus.read_i2c_block_data (0x29, 0) clear = clear = data [1] << 8 | dados [0] vermelho = dados [3] << 8 | dados [2] verde = dados [5] << 8 | dados [4] azul = dados [7] << 8 | data [6] crgb = "Contagens absolutas: C:% s, R:% s, G:% s, B:% s / n"% (claro, vermelho, verde, azul) print (crgb) time.sleep (1) else: print ("Dispositivo não encontrado / n") # normalização e transformação dos valores RGBW medidos col = "" # Valores máximos Fatores de normalização, devem ser definidos experimentalmente # eg vs. uma folha de papel branca. Verifique e corrija de vez em quando. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Fatores de normalização de fundo / valores mínimos, devem ser definidos experimentalmente # por exemplo, vs. folha de papel preta. Verifique e corrija de vez em quando. min_bright = 750 min_bright = 340 min_green = 245 min_blue = 225 # valores normalizados, entre 0 e 1 rel_bright = ((claro - min_bright) / (max_bright - min_bright)) rel_red = ((red - min_red) / (max_red - min_red)) rel_green = ((verde - min_green) / (max_green - min_green)) rel_blue = ((azul - min_blue) / (max_blue - min_blue)) hsv_col = colorsys.rgb_to_hsv (rel_red, rel_green, rel_blue) matiz = hsv_col [0] * 359 if rel_bright> 0,9: col = "white" # if very bright -> white elif rel_bright black else: col = hue2color (hue) # seleção de cores por valores de matiz # print ("valores relativos brilhante, vermelho, verde, azul:") # print (rel_bright, rel_red, rel_green, rel_blue) # print ("HSV values (hue, saturation, value):", hsv_col) # print ("hue in °", hue) return [col, rel_bright, rel_red, rel_green, rel_blue, hue]

def main ():

button = aiy.voicehat.get_button () # change Button status led = aiy.voicehat.get_led () # change Button-LED status aiy.audio.get_recorder (). start () # buttoni = Botão (5) # sensor de distância ou outro botão externo, conectado ao servo3 / GPIO 05

aiy.audio.say ("Hello!",, volume = 50, pitch = 100) # volume e pitch requerem revisão de novembro de 2017 do driver audio.py e _tty.py!

aiy.audio.say ("Para começar, mova o sensor acima do objeto. Em seguida, pressione o botão azul", volume = 50, pitch = 100) print ("Para ativar a medição de cor coloque o sensor acima do objeto e pressione o botão azul ") enquanto True: led.set_state (aiy.voicehat. LED. ON) button.wait_for_press () # para botão externo, substitua botão por buttoni led.set_state (aiy.voicehat. LED. BLINK) aiy.audio.say (" Medindo ",, volume = 50, pitch = 100) result = tcs34725 () # evoca medição e interpretação col = result [0] # color, as text hue = str (int (result [5])) # hue in °, como texto r_red = str (int (resultado [2] * 255)) # valor R, como texto r_green = str (int (resultado [3] * 255)) # valor G, como texto r_blue = str (int (resultado [4] * 255)) # valor B, como texto r_bright = str (int (resultado [1] * 100)) # valor W, como texto led.set_state (aiy.voicehat. LED. OFF) se col == "branco "ou col ==" black ": bright =" "elif (resultado [1]> 0,69): # brilho / luminosidade da cor bright =" light "elif (resultado [1] <0,25): claro =" escuro "else: brilhante = "médio" # comunicando t s resultados color_text = ("A cor do objeto é" + brilhante + "" + col) print (color_text) aiy.audio.say (color_text,, volume = 75, pitch = 100) hue_text = ("O valor de matiz é "+ matiz +" graus ") print (hue_text) aiy.audio.say (hue_text,, volume = 75, pitch = 100)

if _name_ == '_main_': main ()

Etapa 4: alguns links e comentários

A folha de dados do sensor TCS34725 pode ser encontrada aqui:

O código para ler o sensor que usei foi descrito aqui:

Você pode encontrar algumas informações adicionais sobre medidas de cor com este e outro sensor em meus instructables anteriores:

www.instructables.com/id/An-Inexpensive-Ph…

www.instructables.com/id/A-Mimimal-Six-Col…

Recomendado: