Reinhaca
Posts: 5
Joined: Tue Oct 10, 2017 8:28 pm

Programa Python funciona no Pi 3B mas não no Zero

Mon Jul 15, 2019 9:30 pm

Meus pais são idosos e, como dormem pouco, ficam ouvindo rádio AM madrugada afora. Eles sempre reclamam que o rádio não pega algumas estações que queriam, além do sinal ficar indo e vindo e o som ser ruim. Daí achei por aí alguns projetos interessantes que adaptei para que eles usassem de um rádio via WiFi com apenas dois botões e um controle de volume. O sistema funcionou direitinho (depois de muitas tentativas) num Raspberry Pi 3B. Porém, quando fui transpor para um circuito mais barato e "definitivo", usando um Pi Zero W, não funcionou.
Segue o código:

Code: Select all

import RPi.GPIO as GPIO
import os
from subprocess import Popen
import Adafruit_CharLCD as LCD
import atexit
from time import sleep
import random
GPIO.setmode(GPIO.BCM)

# Pinos LCD x Raspberry (GPIO)
lcd_rs        = 23
lcd_en        = 24
lcd_d4        = 12
lcd_d5        = 16
lcd_d6        = 20
lcd_d7        = 21
lcd_backlight = 4

# Define numero de colunas e linhas do LCD
lcd_colunas = 16
lcd_linhas  = 2

# Inicializa o LCD nos pinos configurados acima
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5,
						   lcd_d6, lcd_d7, lcd_colunas, lcd_linhas,
						   lcd_backlight)
# Define os botoes (BCM)
CHANNEL_UP = 3 #GPIO3
CHANNEL_DW = 2 #GPIO2

# Define as matrizes das playlists
nomeradio = []
cidade = []
radiourl = []
radioinicial = 1

nomeradio.append("Globo FM RJ")
cidade.append("Rio de Janeiro")
radiourl.append("http://stream.sgr.globo.com/hls/aRGloboRJ/aRGloboRJ.m3u8")

nomeradio.append("Globo AM")
cidade.append("Juiz de Fora")
radiourl.append("http://r13.ciclano.io:8366/stream.aac?1559573868261")

nomeradio.append("Eldorado FM")
cidade.append("Sao Paulo")
radiourl.append("https://estadaohls-lh.akamaihd.net/i/estadaohls_1@301351/index_200_a-p.m3u8?sd=10&rebase=on")

nomeradio.append("Radio Cultura")
cidade.append("Sao Paulo")
radiourl.append("http://200.136.27.16:8001/stream/1/")

nomeradio.append("Inconfidencia AM")
cidade.append("Belo Horizonte")
radiourl.append("http://192.99.227.251:7050/;")

nomeradio.append("Radio Iatatiaia")
cidade.append("Belo Horizonte")
radiourl.append("http://8903.brasilstream.com.br:8903/stream")

nomeradio.append("Radio Record AM")
cidade.append("Sao Paulo")
radiourl.append("http://stm2.xcast.com.br:9262/stream?1559574548787")

nomeradio.append("Radio Capital")
cidade.append("Sao Paulo")
radiourl.append("https://audio.capitalcomvoce.com.br/capital?1559574704497")

nomeradio.append("Radio Tupi")
cidade.append("Rio de Janeiro")
radiourl.append("http://189.112.0.43:8000/stream/1/")

nomeradio.append("CBN SP")
cidade.append("Sao Paulo")
radiourl.append("https://stream.sgr.globo.com/hls/aCBNSP/aCBNSP.m3u8")

nomeradio.append("Jovem Pan News")
cidade.append("Sao Paulo")
radiourl.append("https://19293.live.streamtheworld.com/JP_NEWSAAC.aac")

nomeradio.append("Tribuna FM")
cidade.append("Vitoria")
radiourl.append("http://cast.midiaip.com.br:6060/stream?1506557548760")

nomeradio.append("BandNews FM")
cidade.append("Sao Paulo")
radiourl.append("http://evpp.mm.uol.com.br/band/bandnewsfm_sp/chunklist_w1028856076.m3u8")

nomeradio.append("BandNews BH")
cidade.append("Belo Horizonte")
radiourl.append("http://evpp.mm.uol.com.br/band/bandnewsfm_bh/chunklist_w1604310346.m3u8")

nomeradio.append("Bandeirantes")
cidade.append("Campinas")
radiourl.append("http://streaming.mobradio.com.br:8002/live.aac")

nomeradio.append("Radiopatos AM")
cidade.append("Patos de Minas")
radiourl.append("http://stm1.painelcast.com:7048")

nomeradio.append("Clube Patos AM")
cidade.append("Patos de Minas")
radiourl.append("http://srv05.brasilstream.com.br:9061/mp3?type=.mp3")

nomeradio.append("Montanhesa FM")
cidade.append("Vazante")
radiourl.append("http://wz1.dnip.com.br/montanheza/montanheza.stream/chunklist_w1457849555.m3u8")

nomeradio.append("Alvorada")
cidade.append("Belo Horizonte")
radiourl.append("https://20323.live.streamtheworld.com/RADIO_ALVORADAAAC_SC")

nomeradio.append("Cultura")
cidade.append("Pocos de Caldas")
radiourl.append("http://caikron.com.br:7020/stream/1/")

nomeradio.append("Ribeirao 79 AM")
cidade.append("Ribeirao Preto")
radiourl.append("http://m3.fabricahost.com.br:8100/;")

nomeradio.append("Cidade")
cidade.append("Mogi das Cruzes")
radiourl.append("http://stm3.sateg.com.br:29234/;")

nomeradio.append("Glogo AM")
cidade.append("Sao Carlos")
radiourl.append("http://servidor39.brlogic.com:8190/live")

nomeradio.append("Bom Jesus FM")
cidade.append("Ribeirao Bonito")
radiourl.append("http://servidor20.dnip.com.br:8530/")

nomeradio.append("Vitoriosa AM")
cidade.append("Lagoa Formosa")
radiourl.append("http://stream.radiovitoriosa.com.br:8044//;stream.mp3")

nomeradio.append("Juriti AM")
cidade.append("Paracatu")
radiourl.append("http://streaming22.hstbr.net:8316/live")

nomeradio.append("Difusora AM")
cidade.append("Patrocinio")
radiourl.append("http://srv01.brasilstream.com.br:8026/mp3")

nomeradio.append("Gazeta")
cidade.append("Sao Paulo")
radiourl.append("http://servidor1a.crossdigital.com.br:9552/1")

nomeradio.append("Dourado FM")
cidade.append("Dourado")
radiourl.append("http://euroticast5.euroti.com.br:8044/;stream/1")

nomeradio.append("Calhambeque")
cidade.append("Internet")
radiourl.append("http://198.100.146.218:7096//;stream.mp3")

# Rotina de saida
def finish():
	lcd.clear()
	lcd.cursor_pos = (0, 3)
	lcd.message("Parando...")
	exec_command("service mpd stop")
	GPIO.cleanup()
	print("Radio parado")
atexit.register(finish)

# Executa system command sub-routine
def exec_command(cmd):
	result = ""
	p = os.popen(cmd)
	for line in p.readline().split('\n'):
		result = result + line
	return result

### Rotina principal ###
if __name__ == "__main__":
	GPIO.setmode(GPIO.BCM)
	GPIO.setup(CHANNEL_UP,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
	GPIO.setup(CHANNEL_DW,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)

	lcd.clear()
	lcd.message("Conectando...")
	exec_command("service mpd start")
	exec_command("mpc clear")
	sleep(1)

	for i in range(len(nomeradio)-1):                 #adiciona as playlists ao mpc
		exec_command("mpc add " + radiourl[i])

	radioinicial = random.randint(0, len(nomeradio)-1)   #sorteia, dentro da matriz contendo as playlists (comeca em 0), uma das radios
	no_RadioTocando = radioinicial + 1                    #A radio que esta tocando e o indice da matriz +1
	max_pls_no = len(nomeradio)                       #variavel que contem o numero de playlists carregadas
	exec_command("mpc play " + str(no_RadioTocando))  #toca a radio sorteada
	exec_command("mpc volume 90")                     #poe o volume em 90%

	current = exec_command("mpc current")
	print "Tocando... " + current                     #mostra no terminal qual esta tocando
	print nomeradio[radioinicial]
	print "press CTRL + C to stop"

	# Atualiza o LCD com o nome da radio que esta tocando
	lcd.clear()
	lcd.message(nomeradio[no_RadioTocando - 1])        #Escreve a primeira linha (nome da radio)
	lcd.message('\n')                                  #Passa pra linha de baixo
	lcd.message(cidade[no_RadioTocando - 1])           #Escreve a cidade

	while True:                                        #Repete tudo isso daqui
		sleep(0.1)                                    #pra nao usar toda a CPU
		MudouEstacao = False                           #Ainda nao mudou a estacao

		if GPIO.input(CHANNEL_UP):          #Se apertar o botao pra subir uma estacao:
			no_RadioTocando += 1            #incrementa o indice
			if no_RadioTocando > 30:        #Testa se passou da ultima estacao da lista
				no_RadioTocando = 1         #se sim vai pra primeira da playlist
			exec_command("sudo service mpd restart")
			exec_command("mpc play " + str(no_RadioTocando))       #e toca ela
			MudouEstacao = True                  #Avisa la que mudou de estacao!

		if GPIO.input(CHANNEL_DW):           #Se apertar o botao para descer a estacao:
			no_RadioTocando -= 1             #decrementa o indice
			if no_RadioTocando < 1:          #Testa se chegou abaixo da primeira da lista
				no_RadioTocando = 30         #se sim passa pra ultima
			exec_command("sudo service mpd restart")
			exec_command("mpc play " + str(no_RadioTocando))       #e toca ela
			MudouEstacao = True                  #Avisa la que mudou de estacao tambem!

		if MudouEstacao:                         #Se a estacao mudou, atualiza o LCD e o terminal
			lcd.clear()
			lcd.message(nomeradio[no_RadioTocando - 1])        #Escreve a primeira linha (nome da radio)
			lcd.message('\n')                                  #Passa pra linha de baixo
			lcd.message(cidade[no_RadioTocando - 1])           #Escreve a cidade
			print "Tocando... "                                #mostra no terminal qual esta tocando
			print nomeradio[no_RadioTocando - 1]
			print cidade[no_RadioTocando - 1]
		sleep(0.2)
O erro que dá é o seguinte: ele escreve certinho no LCD e busca a estação na rede, mas parece que há um problema com o streaming do MPD, porque ele fica repetindo o nome da estação/cidade a cada 5 segundos e toca uma fração de segundo da transmissão. Parece que não tem memória para um "buffer" do streaming. Vejam como fica:

Code: Select all

pi@raspberrypi:~ $ cd Desktop
pi@raspberrypi:~/Desktop $ sudo python Radio.py
sh: 1: stream.mp3: not found
sh: 1: stream/1: not found
Tocando... http://srv05.brasilstream.com.br:9061/mp3?type=.mp3
Clube Patos AM
press CTRL + C to stop
Tocando... 
Clube Patos AM
Patos de Minas
Tocando... 
Clube Patos AM
Patos de Minas
Tocando... 
Clube Patos AM
Patos de Minas
Tocando... 
Clube Patos AM
Patos de Minas
Só para depois que eu dou CTRL+C...
O que eu fiz de errado? Que adaptação temos que fazer para migrar do Pi 3B para o Zero?

Reinhaca
Posts: 5
Joined: Tue Oct 10, 2017 8:28 pm

Re: Programa Python funciona no Pi 3B mas não no Zero

Tue Jul 16, 2019 11:27 am

Mais uma coisa que eu vi aqui agora: CPU fica a 100% direto. Daí aumentei o tempo dos sleep's mas mesmo assim o problema continua... E outra: os comandos de troca de estação não estão funcionando.

Reinhaca
Posts: 5
Joined: Tue Oct 10, 2017 8:28 pm

Re: Programa Python funciona no Pi 3B mas não no Zero

Tue Jul 16, 2019 4:23 pm

Resolvi:
Alterei o arquivo de configuração do MPD.
Usei:

Code: Select all

sudo nano /etc/mpd.conf
E alterei o trecho abaixo:

Code: Select all

# If MPD has been compiled with libsamplerate support, this setting specifies
# the sample rate converter to use. Possible values can be found in the
# mpd.conf man page or the libsamplerate documentation. By default, this is
# setting is disabled.
#
samplerate_converter "Fastest Sinc Interpolator"      #Descomentar essa linha
#
Depois CTRL+O, CTRL+X...
Agora o uso da CPU fica abaixo dos 10% com alguns picos em 50%.
Alterei os botões para outros GPIO que não o 2 e 3 (usados pelo I2C) e fiz mais alguns ajustes no programa e está funcionando muito bem!

Return to “Português”