
https://www.oceanlight.com/log/northern-fur-seal.html
Eventualmente pode ser bastante útil analisar off-line dados práticos, principalmente se eles foram transmitidos como um streaming de caracteres ASCIII pela porta serial/USB.
Capturando Dados de Porta SerialCódigo: Versão simplesPorta de Comunicação com ArduinoExemplo de UsoInstalando PythonTeste inicialInstalando dependências (Bibliotecas)
Segue um programa feito para Python para captura de dados gerados por uma placa Arduino Uno:
captura_serial_data.py (baixe aqui, eventualmente usando "Salvar link como..."):
xxxxxxxxxx# Captura dados da porta serial, tal qual foram enviados# e cria arqiuvo texto refletindo os dados capturados# Realiza um "dump" dos dados sendo recebidos pela porta serial# Fernando Passold, em 19/06/2024import serial # Instalar com: > pip install pyserial ou % conda install -c anaconda pyserialimport threadingimport os# Configurações da porta serial# porta_serial = '/dev/cu.usbmodem14201' # Substitua pelo nome da porta serial correta no seu macOS# porta_serial = '/dev/cu.usbmodem142101' # no caso do macOSporta_serial = 'COM3' # no caso do Windowstaxa_baude = 115200 # 9600 # <-- modifique o valor "default"# Função para parar a captura quando uma tecla for pressionadadef espera_tecla(): print("\nScript para captura de dados à partir de porta serial") input("Pressione Enter para parar a captura de dados...\n\n") global capturando capturando = False# Função principal para ler da porta serial e escrever no arquivodef captura_dados(): linhas_capturadas = 0 try: with serial.Serial(porta_serial, taxa_baude, timeout=1) as ser: with open('dados_capturados.txt', 'w') as arquivo: while capturando: linha = ser.readline().decode('utf-8').strip() if linha: linhas_capturadas += 1 arquivo.write(linha + '\n') print(f"\rLinhas capturadas: {linhas_capturadas} | {linha} ", end='') # exibe linha sem "\n" except serial.SerialException as e: print(f"Erro ao acessar a porta serial: {e}") except OSError as e: print(f"Erro ao abrir o arquivo: {e}")# Variável global para controlar a capturacapturando = True# Inicia a captura de dados em uma thread separadathread_captura = threading.Thread(target=captura_dados)thread_captura.start()# Espera o usuário pressionar uma tecla para parar a capturaespera_tecla()# Aguarda a thread de captura finalizarthread_captura.join()print("\nCaptura de dados finalizada.")print("\nGerado arquivo: dados_capturados.txt")Uso
Abra o "Prompt de Comandos" (no Windows, ou no terminal no macOS/linux) e digite:
xxxxxxxxxxpython capture_serial_data.pyObservações:
Esta rotina só é executada com sucesso se não existe outro programa acessando a porta serial do Arduíno. Isto é, para este script conseguir capturar dados, o Terminal ou Serial Plotter da IDE do Arduino não podem estar sendo executado. Seriam 2 programas "competindo" pe,o memso recurso simulataneamente (não é possível).
Sempre será gerado o arquivo dados_capturados.txt. Se você deseja mudar este nome, deve editar o programa Python ou (mais fácil), simplesmente renomei o arquivo texto recém criado para outro nome desejado.
Atenção para a linha porta_serial = '/dev/cu.usbmodem142101'. Nesta linha você (o programador), deve indicar a porta de comunicação adotada pelo seu computador com o Arduíno.
Por último certifique-se que este script está trabalhando com o mesmo baud rate da placa Arduino:
xxxxxxxxxxtaxa_baude = 115200 # 9600 # <-- modifique o valor "default"
É possível descobrir a porta de comunicação usada à partir da própria IDE do Arduíno:
No Windows:

No macOS:

Uso
Abra o "Prompt de Comandos" (no Windows, ou no terminal no macOS/linux) e digite:
xxxxxxxxxxpython capture_serial_data.pyExemplo (no Windows):
xxxxxxxxxxZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>python capture_serial_data.pyErro ao acessar a porta serial: could not open port '/dev/cu.usbmodem142101': FileNotFoundError(2, 'O sistema não pode encontrar o caminho especificado.', None, 3)Pressione Enter para parar a captura de dados...Captura de dados finalizada.Z:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>Neste caso, foi esquecido de indicar a porta correta. Procedendo a correção usando o "Bloco de Notas" para editar as linhas em questão:
xxxxxxxxxx# porta_serial = '/dev/cu.usbmodem142101' # no caso do macOSporta_serial = 'COM3' # no caso do WindowsE agora devemos obter algo como:
xxxxxxxxxxZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>python capture_serial_data.pyScript para captura de dados à partir de porta serialPressione Enter para parar a captura de dados...Linhas capturadas: 361 | 149 -0.622862Linhas capturadas: 362 | 149 -0.536371Captura de dados finalizada.Gerado arquivo: dados_capturados.txtZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>
Para usá-lo você precisa ter o Python instalado no seu computador. Isto pode ser feito (no Windows), baixando e instalando à partir de: https://www.python.org/downloads/ (em outubro/2024, estava na versão 3.13.0; mas não é ncessário baixar a última versão).
Durante a instalação do Python o Windows além de perguntar se você deseja instalar apenas para o usuário atual ou para todos na máquina atual, ele pergunta (importante) se você deseja atualizar o PATH do sistema para que as janelas do comando reconheçam o Python instalado no seu computador.
Como teste inicial, experimente apenas executar: > python --version (ou python3 --version).
No caso do Windows resulta algo como:
xxxxxxxxxxC:\Users\fpassold>python --versionPython 3.12.0C:\Users\fpassold>No caso de um macOS resulta algo como:
xxxxxxxxxx(base) fernandopassold@MacBook-Pro-de-Fernando ~ % python --version Python 3.12.7(base) fernandopassold@MacBook-Pro-de-Fernando ~ %
Eventualmente o script acima ao ser executado resulta erros. Se nas mensagens de erro constar algo como:
xxxxxxxxxxZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>python capture_serial_data.pyTraceback (most recent call last): File "Z:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor\capture_serial_data.py", line 6, in <module> import serial # Instalar com: % conda install -c anaconda pyserial ^^^^^^^^^^^^^ModuleNotFoundError: No module named 'serial'Z:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>significa que, neste caso, faltou a biblioteca serial.
No caso do código, são necessárias as bibliotecas:
que estão associadas com as linhas:
x
import serial # Instalar com: > pip install pyserial ou % conda install -c anaconda pyserialimport threadingimport osExistem diferentes formas instalar as bibliotecas necesárias, mas vou sugerir a mais simples que normalmente dá certo. Para cada uma das bibliotecas digite:
pip install pyserial (ou conda install -c anaconda pyserial se você instalou o Anaconda). Mais informações sobre esta biblioteca, clicar aqui.Obs: normalmente o comando pip acompanha a instalação do Python.
Por exemplo, no caso do Windows, resulta algo como:
xxxxxxxxxxZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>pip --versionpip 23.2.1 from C:\Users\fpassold\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip (python 3.12)Z:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>pip install pyserialCollecting pyserial Obtaining dependency information for pyserial from https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl.metadata Downloading pyserial-3.5-py2.py3-none-any.whl.metadata (1.6 kB)Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB) ---------------------------------------- 90.6/90.6 kB 854.7 kB/s eta 0:00:00Installing collected packages: pyserialSuccessfully installed pyserial-3.5[notice] A new release of pip is available: 23.2.1 -> 24.2[notice] To update, run: python.exe -m pip install --upgrade pipZ:\fpassold\Documents\UPF\Lab_Processa_Sinais\2024_2\Pulse_Monitor>
🌊 Fernando Passold 📬 ,