Boa noite pessoal, estou me formando em Análise e Desenvolvimento de Sistemas e como trabalho de conclusão de curso estou montando uma central que gerencia a energia elétrica de determinados ambientes, o acesso as informações e comando desta central acontecem via webBrowser, estou tendo problema para conseguir fazer funcionar o meu sensor ACS712 junto com meu RPI3. Segui as especificações e fiz a inserção do Conversor Lógico I2C:

o problema acontece quando tento executar o script Python, primeiramente tentei utilizar o código desse tópico aqui mas não obtive sucesso por conta das bibliotecas SPIDEV, após algumas alterações o script rodou entretanto sem capturar nenhum dado do sensor, depois tentei utilizar a porta I2C o que para mim se torna mais cômodo pois a central possui uma tela Touch que utiliza as portas SPI, entretanto também não obtive sucesso ao tentar ler os valores do sensor via I2C Caso algum dos camaradas á tenha passado por isso e queira me ajudar a resolver meu problema serei muito grato. Abraço!

Exibições: 3030

Responder esta

Respostas a este tópico

Boa tarde José Gustavo! Esse é o meu esquema ainda não testei. Seria dessa forma a ligação?

Boa noite Leonardo .

Qual programa usou para o diagrama? Gostei !

0) Esta faltando conexão do terra(GND) do Raspberry Pi com o terra(GND)  do Protoboard !

1) Faltando a conexão com a tensão 3,3V - vai conectar no Raspberry ?
2) Faltando a conexão com a tensão 5,0V - vai conectar no Raspberry ?
3) GPIO 08 (SPI-CS) - L4/H4 - TLC2543 pino 15 (/CS)
4) GPIO 09 (SPI-MISO) - L2/H2 - TLC2543 pino 17 (Data In)   ERRADO 
5) GPIO 10 (SPI-MOSI) - L3/H3 - TLC2543 pino 16 (Data Out)  ERRADO 
6) GPIO 11 (SPI-SCK) - L1/H1 - TLC2543 pino 18 (I/O Clock)

CORRETO É ASSIM :

MOSI = Master (Raspberry) Out / Slave (LTC2543) In 

MISO = Master (Raspberry) In / Slave (LTC2543) Out 

4) GPIO 09 (SPI-MISO) - L2/H2 -  TLC2543 pino 16 (Data Out)  CORRETO
5) GPIO 10 (SPI-MOSI) - L3/H3 - TLC2543 pino 17 (Data In)   CORRETO

Como já tinha informado 

RaspBerry Pi            ADC TLC2543 

SCLK -----------------  I/O CLOCK PINO 18

MOSI------------------  DATA INPUT PINO 17

MISO-----------------   DATA OUT PINO 16 

CS --------------------  /CS PINO 15 

Boa tarde José Gustavo, tudo bem? 

Eu utilizei o CorelDraw x8 para desenhar esse modelo.

Agora atualizado

Esse é o código python que tentei adaptar a partir do código C que você havia me enviado:

#!/bin/python
from periphery import SPI
import RPi.GPIO as GPIO
import time
import numpy as np

spi = SPI("/dev/spidev1.0", 0, 1000000)

SPI_CLK = 23
SPI_MISO = 21
SPI_MOSI = 19
SPI_CS = 24

chipSelectPin = 7
values[11]=0
ct.c_uint16(value)

def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(SPI_MOSI, GPIO.OUT)
GPIO.setup(SPI_MISO, GPIO.IN)
GPIO.setup(SPI_CLK, GPIO.OUT)
GPIO.setup(SPI_CS, GPIO.OUT, initial=GPIO.HIGH)

def loop():
readAdcAll()

for np.uint8(channel) in range(channel, 11):
print ("Channel " + channel + "=" + values[channel] + "\t")

print ("")
time.sleep(500)

def readAdcAll():
ct.c_uint16(value = 0)
for np.uint8(channel) in range(channel, 11):
values[channel - 1] = readAdc(channel)
values[10] = readAdc(0)

def readAdc():
ad
ad_1

GPIO.output(SPI_CS, LOW) # Ativa o chip
time.sleep(10)

ad = spi.transfer((chx 4) | 0x0C)
ad_1 = spi.transfer(0);


GPIO.output(SPI_CS, HIGH)
ad = 8
ad |= ad_1
ad >>= 4

time.sleep(10)

return ad

No código em C ele implementa uma classe uint16_t, tentei através
da classe numpy implementar essa unçãoporém recebo o seguinte retorno:

for np.uint8(channel) in range(channel, 11):
SyntaxError: can't assign to function call

Um outro problema surgiu com o uso das portas SPI, dentro do projeto existe uma tela LCD
que mostrará ao usuário algumas informações, quando ativo as portas SPI minha tela para
de funcionar, a tela tb utiliza as portas SPI. Estava pensando se como estamos utilizando o
conversor lógico se não poderíamos utilizar as portas I2C para a comunicação com o ADC.

Boa tarde Leonardo, 

O Diagrama esta correto !

Acho que a alimentação do Raspberry Pi ( 5V e 3,3V ) possa suportar o seu circuito. 

Eu não tenho experiência com programação. 

Sugiro que faça testes por partes, para identificar o seu problema no Python.

Simplifique ao máximo. Depois que estiver funcionando, poderá implementar uma programação mais adequada. (usando Bibliotecas) . 

Favor colocar comentários em cada linha. Ficará mais fácil para entender o programa. 

Qual display LCD esta usando? Existe LCD com interface I2C. 

(informe as especificações, links, fotos) .

Não dá para usar portas I2C com o ADC . O ADC é SPI.

Não sei qual a taxa de amostragem do ADC pretende usar. Mas se for baixa, pode ser que dê para usar o LCD juntamente com o ADC na interface SPI. 

Continuando sobre o ADC TLC2543 :

Envie o seu programa Python para que eu possa conferi-lo.

Estude isso ! Poderá ajuda-lo :

Microcontroller Based Data Acquisition Using the TLC2543

http://www.ti.com/lit/an/slaa012/slaa012.pdf

Clock máximo de 4,1 MHz. Portanto ao usar o protocolo SPI, use a velocidade de 4MHz. Não use 10MHz .

MSB First ! Bit mais significativo primeiro. 

O pino EOC significa fim de conversão ( activo HIGH) . Enquanto esta sendo feita a conversão, esse pino esta LOW e não pode ser feita a comunicação SPI para ler os dados. Somente quando estiver HIGH, os dados poderão ser lidos. Isso é importante para sincronizar o ADC com o RPI3. 

Essa é a carta de tempo, para a comunicação com o ADC :

Continuando sobre o ADC TLC2543 :

Consulte o Datasheet 

O datasheet do seu ADC TLC2543CN é esse (corrigindo) 

http://www.ti.com/lit/ds/symlink/tlc2543.pdf

Antes de fazer a leitura, precisará configurar esses registradores . (Write do ADC):

Selecione a entrada do ADC que vai usar . Por exemplo AIN1 = D7(0), D6(0), D5(0), D4(1) .

Para Medir a metade da REF (+2,5V)  = D7(1), D6(0), D5(1), D4(1) .

Dados da comunicação - sugiro que use 16 bits D3(1), D2(1).  Depois descodifique os 12 bits.

SPI MSB Firts => D1 = 0 

Unipolar => D0 = 0 

Analisando o programa Python para ADC com interface SPI :

http://www.python-exemplary.com/index_en.php?inhalt_links=navigatio...

Experiment 4: Using the MCP3008 (SPI)

O protocolo SPI Serial Peripheral Interface) utiliza um barramento com 5 linhas: GND, SCLK (Relógio), MOSI (Master Out Slave In), MISO (Master In Slave Out) e CS (Chip Select). Os dados são transferidos pelo bit e o tempo é extremamente simples:

Para enviar dados do mestre (normalmente o Raspberry Pi) para um cliente (aqui o chip MCP3008), o mestre ativa o CS (puxando-o para baixo), define o bit (alto ou baixo) para MOSI e envia um pulso de relógio configurando SCLK para alta e pouco depois para baixo.

Para solicitar dados do cliente (com CS habilitado), o mestre envia um pulso de relógio e lê o nível no MISO.

Use o conversor de tensão de 3,3v para 5V 

RaspBerry Pi            ADC TLC2543 

SCLK -----------------  I/O CLOCK PINO 18

MOSI------------------  DATA INPUT PINO 17

MISO-----------------   DATA OUT PINO 16 

CS --------------------  /CS PINO 15 

Esse comando é diferente no LTC2543 

# Send command
control = channel # control register
control |= 0b00011000 # Start bit at b4,
# Single-ended bit at b3
# Channel number (b2, b1, b0)

No caso do LTC2543 

exemplo 

0b00001100 - canal AIN0 , 16 bits, MSB First, Unipolar

Conclusão : os procedimentos são bem diferentes do seu ADC. Terá que criar um programa específico para seu ADC

Boa tarde Leonardo. 

Eu faria uma adaptação desse código de Arduino para o Python do Rasp Pi :

https://github.com/volthouse/hardware-firmware-arduino/blob/master/...

https://github.com/volthouse/hardware-firmware-arduino/tree/master/...

Boa noite Leonardo. 

Analisando a função principal - ler o dados do conversor ADC 

(me corrija, se eu estiver errado) 

Envie o arquivo do seu programa ( copiando e colando , pode ser interpretado incorretamente) 

def readAdc():
ad # definição de variável
ad_1 # definição de variável

GPIO.output(SPI_CS, LOW) # Ativa o ADC
time.sleep(10) # aguarda 10 segundos ? Ou são milisegundos ?

ad = spi.transfer((chx 4) | 0x0C) # transfere o Byte mais significante ? MSB
ad_1 = spi.transfer(0); # transfere o segundo byte para ad_1

  
   GPIO.output(SPI_CS, HIGH)     # desativa o ADC
ad = 8 # ad = 8 ? não entendi. O certo não seria isso ? ad = 8;
ad |= ad_1 # ad bitwise OR ad_1
ad >>= 4 # ad bitshift right 4
 
time.sleep(10) # aguarda 10 segundos ? Ou são milisegundos ?


return ad # retorna o valor de ad

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço