Ir ao conteúdo
  • Cadastre-se

Cabo USB-RS232


Evertton Laddaga

Posts recomendados

Galera é o seguinte tenho que fazer uma comunicação serial entre meu pic e meu notebook, como a conexão serial quase não existe mais em PC e em notebook já foi extinta, necessito usar um daqueles cabos conversores usb-serial. Gostaria de saber se eu posso usar esses cabos para fazer minha comunicação, eles alteram minha transmissão?

Link para o comentário
Compartilhar em outros sites

Desista,

Migre logo para uma conexão CDC. Essa conexãos se dá por USB mas o PC reconhece uma porta COM.

Bem, um exemplo básico está abaixo. O código super simples.

Estou rodando um Windows XP virtual porque o Proteus não possui drivers USB que rodem no widnows 7 x64. Se você montar o circuito na prática, funciona normalmente.

Circuito capado apenas para simulação:

circuito.png

Reconhecido pelo windows como COM3:

reconhecidowindowsvirtu.png

Sistema rodando no hyperterminal:

simulaorodando.jpg

Código:

#include <18F4550.h>
#device adc=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include <usb_cdc.h>

void main()
{
usb_cdc_init(); // Inicia protocolo cdc
usb_init(); // Inicia USB

for(;
{
usb_task(); // Testa comunicaçao usb

if (usb_enumerated())
{
printf(usb_cdc_putc,"Testando Conexao USB->Serial!\n\r");
delay_ms (100);
}
}
}

Esse esquema que passei para você, funciona no windows 7 64bits! Só a simulação que não por causa do Proteus.

Fiz outro exemplo aqui, básico. Ele acende dois leds no circuito atraves do C#.

O PIC irá emular uma COM. Fiz no CCS.

O exemplo que fiz é bem simples.

Circuito:

circuito.jpg

Código PIC:

#include <18F2550.h>
#device adc = 8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include <usb_cdc.h>

#define LED_RED PIN_B6
#define LED_GREEN PIN_B7

int8 n;

char buffer [9];

void main()
{
output_b(0x00);
usb_cdc_init(); // Inicia protocolo cdc
usb_init(); // Inicia USB

for(;
{
usb_task(); // Testa comunicaçao usb
if (usb_enumerated())
{

if (usb_cdc_kbhit())
{
buffer[0] = usb_cdc_getc();
}

if (usb_cdc_kbhit())
{
buffer[1] = usb_cdc_getc();
}

if (usb_cdc_kbhit())
{
buffer[2] = usb_cdc_getc();
}

if (buffer [0] == 1)
{
if (buffer [1] == 2)
{
output_toggle (LED_RED);
}

if (buffer [2] == 3)
{
output_toggle (LED_GREEN);
}
}

for (n=0;n<9;n++)
{
buffer[n]=0;
}

if (usb_enumerated())
{
printf(usb_cdc_putc,"PIC Conectado!");
delay_ms (500);
}
}
}
}

Código C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SimpleSerial
{
public partial class Form1 : Form
{
// Variáveis
string RxString;
byte[] buff = new byte[3];

public Form1()
{
InitializeComponent();
}

private void buttonStart_Click(object sender, EventArgs e)
{
// Altere para sua COM. Veja no gerenciador de sipositivos qual a disponível
bool error = false;
serialPort1.PortName = "COM4";
serialPort1.BaudRate = 9600;

if (!serialPort1.IsOpen)
{
try
{
// Abrir a porta
serialPort1.Open();
}
catch (UnauthorizedAccessException) { error = true; }
//catch (IOException) { error = true; }
catch (ArgumentException) { error = true; }

if (error) MessageBox.Show(this, "Não foi possível abrir a porta COM. Está em uso, foi removida ou não está disponível.", "COM Port não disponível", MessageBoxButtons.OK, MessageBoxIcon.Stop);

//serialPort1.Open();
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
button_red.Enabled = true;
button_green.Enabled = true;
textBox1.ReadOnly = false;
}
}
}

private void buttonStop_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
buttonStart.Enabled = true;
buttonStop.Enabled = false;
button_red.Enabled = false;
button_green.Enabled = false;
textBox1.ReadOnly = true;
}

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) serialPort1.Close();
}

private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting();

this.Invoke(new EventHandler(DisplayText));
}

private void button1_Click(object sender, EventArgs e)
{
buff[0] = 1;
buff[1] = 0;
buff[2] = 3;

serialPort1.Write(buff, 0, 3);
}

private void button2_Click(object sender, EventArgs e)
{
buff[0] = 1;
buff[1] = 2;
buff[2] = 0;

serialPort1.Write(buff, 0, 3);
}

private void button1_Click_1(object sender, EventArgs e)
{
buff[0] = 1;
buff[1] = 2;
buff[2] = 3;
serialPort1.Write(buff, 0, 3);
}
}
}

Arquivos do projeto para simulação:

Conexao_CDC_exemplo_c

Falou

Link para o comentário
Compartilhar em outros sites

Pow eu tenho muito interesse em mudar pra uma comuncação USB, no entanto é um projeto de faculdade e eu não tenho mais tempo pra mudar nada, eu desenvolvi a interface a programação no microcontrolador e já ta tudo terminado só falta testar a comunicação com esse cabo conversor... tem certeza que eu não consigo? isso é muito preocupante, =S

Meu seven é 32 bits, será que eu consigo simular no proteus sem a necessidade de emular um XP?

Link para o comentário
Compartilhar em outros sites

voce consegue sim,mas vai ter que testar os vários cabos e drivers que existe.

Ta na hora,depois de feito o traballho,de voce estudar a comunicaçã USB,prinipalmente a nativa,sem emular RS232 ou ficará 'amarrado' a RS232.

Futuramente os sistemas operacionais vão 'abolir' este protocolo e voce terá que correr atrás do prejuizo.

Link para o comentário
Compartilhar em outros sites

O que o Matheus postou está correto e é o que no mínimo todos devem estudar.

Eu frisei a implementação completa apenas para que o assunto não pare por aí.

Sobre o cabo,infelizmente vai ter que esperar ou procurar em outros foruns,qual o mais 'completo',pois alguns foram produzidos para emular a serial através de um driver e outros foram produzidos (através do driver) para ser uma porta COM 'real',aí vai depender de como o Hardware vai ser usado.

Link para o comentário
Compartilhar em outros sites

Poxa isso vai me dar mais dor de cabeça que eu imaginava... pior é que eu nem tenho o pic da família 18FXX se eu for pedir pra vir via correios vai ficar muito caro e vai demorar demais, moro em Rondônia, as coisas aqui são difíceis de achar e muito demorada pra chegar... =S

Link para o comentário
Compartilhar em outros sites

Então, acredito que nesse caso, seria mais fácil você usar um computador desktop com mais de 2 anos que com certeza tem uma entrada serial.

Caso você não tenha um compuatdor desse ou consiga emprestado, sinto dizer mas você teria que ter visto esse detalhe, que é bem importante, no início do projeto.

Não estou querendo ser chato. Já fiz um projeto assim e a primeira coisa que me veio à cabeça foi a possibilidade de encontrar um notebook com entrada serial. Como seira muito difícil, fiz tudo com USB.

Mas o seu projeto ;e muito grande? explique ele melhor que dependendo do tamanho posso modificar pra você. Claro que vai depender do software que está do lado do PC.

Falou

Link para o comentário
Compartilhar em outros sites

Meu projeto é bem simples. eu controlo o sentido de rotação e velocidade de um motor através de um sensor de temperatura (LM35) isso com dispositivo funcionando de forma automática, essa temperatura é enviada para o PC que possui uma interface que eu desenvolvi em visual C#. Em modo manual o operador pode controlar a temperatura e a velocidade do motor através da interface...

Quando meu sensor registra uma temperatura menos que 30º meu motor irá atuar como um ventilador, quando o registro de temperatuda é maior que 30º o meu motor irá atuar como um exaustor... (na verdade o lm35 é apenas para protótipo, o verdadeiro projeto é utilizado com um sensor de gás).

vou te mandar os arquivos ta meio bagunçado e feio porque eu ainda to arrumando, ainda não parei pra melhorar a parte visual do programa... mas basicamente é isso ai.

Na parte da interface tem um lugar que é pra dizer qual a velocidade do motor, mas eu não consegui fazer uma forma de enviar a velocidade e a temperatura do pic para a o PC, é uma ou outra teria como você da uma olhadinha pra mim e ver se você consegue uma solução?

Outra coisa que eu gostaria de mudar é na parte de controle de velocidade, eu fiz 3 velocidades fixas, mas gostaria de ter um controle mais fino, "linear". Com o controle automático posso criar isso através do lm35, criando uma função pra ele... mas para o controle manual de velocidade não sei como posso fazer, pensei em usar um TrackBar igual você usou no seu projeto que eu vi em um tutorial muito bem feito, mas não consegui. =S

Arquivo para download

http://www.4shared.com/rar/vcqdh4Xy/Arquivos.html?

Pode tambem comprar uma PCI Com serial/Paralela,em média 40.00.

a placa mãe do meu PC de sala tem a conexão serial, só tenho que comprar o rabicho com o espelho, é que na hora da apresentação do projeto não é muito pratico levar um desktop para a sala de aula... hehehe por isso o ideal era usar o notebook.

Link para o comentário
Compartilhar em outros sites

Eu uso uma adaptador USB-RS232 aqui em casa, e ele funciona muito bem. Para a comunicação geralmente da certo. O que não dá certo é com gravador JDM, que necessitam de 12v para trabalhar.

É um igual a esse:

12-186-105-TS?$S300W$

A marca é Prolific.

O ideal seria utilizar a porta USB, porém eu não entendo porque o protocolo é tão complicado. Já consegui mexer com o modo HID com base em um código que o vtrx me passou, mas nada além disso.

Alguém conhece um bom livro que explique em detalhe como funciona o protocolo? De preferência focado com microcontroladores PIC ou AVR.

Link para o comentário
Compartilhar em outros sites

Eu ja pensei a muito tempo atras,de fazer um tutorial para USB HID e BULK,mas o problema é que eu só programo no PC em Delphi e C++ (Borland).

Não gosto de Visual C++ ou C# pois exige uma lista muito grande de 'Run times' instalado no PC para rodar um .exe

O Firmware eu teria que mostrar em C18,pois em ASM acho que a maioria não tem experiencia e 'saco'.

A classe HID é a mais fácil de se manipular,mas acho que preciso fazer um exemplo mais 'completo',mas isso envolve tempo para projetar a placa teste,além do mais,fico observando o que a maioria mais gostaria de fazer com um PIC espetado no USB,piscar Leds é inútil depois que voce ver que eles realmente piscam usando USB.

Link para o comentário
Compartilhar em outros sites

Você consegue usando os adaptadores simplificados CP1202 ou PL2303, tem no mercado livre, são USb - TTL, de 5 ou 6 pinos, basicamente RX-TX.

Para enviar mais de uma informação eu concateno no c#. Abaixo mando a cor selecionada RGB, que é composta por três valores de 8bits, ficando na mesma resolução do PWM que usei no atmega

pwmx = "ledr" + String.Format("{0:000}", colorDialog1.Color.R) + "ledg" + String.Format("{0:000}", colorDialog1.Color.G) + "ledb" + String.Format("{0:000}", colorDialog1.Color.;
serialPort1.NewLine = "\r\n";
serialPort1.Write(pwmx + "\r\n");

Separação no atmega, em basic, para acionar um LED RGB de acordo com a cor escolhida no PC:

If Instr(1 , StringSerial , "led") > 0 Then
Sledr = Mid(s , 5 , 3)
Sledg = Mid(s , 12 , 3)
Sledb = Mid(s , 19 , 3)
Pwledr = Val(sledr)
Pwledg = Val(sledg)
Pwledb = Val(sledb)
Pwm0a = Pwledr
Pwm0b = Pwledg
Pwm1a = Pwledb
End If

Teste com o mesmo adaptador e acelerômetro, mas dessa vez, é o pc que recebe os dados:

Link para o comentário
Compartilhar em outros sites

Evertton, dei uma passada de olho no seu projeto e ele tá muito legal. Tá muito bem feito o layout no C#. Gostei mesmo.

Amanhã com calma dou uma olhada no código.

[off-topic]jpsek, Vi seu vídeo. São bem interessantes. Todos. Mas surgiu uma dúvida. Onde você desenha os cubos?

Comecei a ver alguns vídeos relacionados e estou chutando que foi no Unity 3D. Se foi, gosteid a ideia.

Chegueia dar uma rápida googleada e vi que o Unity aceita comunicaçao serial......

[/off-topic]

Link para o comentário
Compartilhar em outros sites

Esse problema de RS232 - USB é um saco ....

Existem alguns "cabos" que incluem um conversor de protocolo com CIs do tipo FTDI, mas a maioria não inclui todos os sinais , como CTS, RTS, DSR, etc, e nesse caso, dependendo do tipo de conexão serial ao microprocessador, não vai funcionar.

Sugiro verificar na documentação ( quando existir... ) quais os sinais que estão presentes no cabo.

E também tome cuidado com a tensão, alguns tem +12 / -12 , e outros tem +5 / -5 Volts. !!!

Paulo

Link para o comentário
Compartilhar em outros sites

Evertton, dei uma passada de olho no seu projeto e ele tá muito legal. Tá muito bem feito o layout no C#. Gostei mesmo.

Amanhã com calma dou uma olhada no código.

[off-topic]jpsek, Vi seu vídeo. São bem interessantes. Todos. Mas surgiu uma dúvida. Onde você desenha os cubos?

Comecei a ver alguns vídeos relacionados e estou chutando que foi no Unity 3D. Se foi, gosteid a ideia.

Chegueia dar uma rápida googleada e vi que o Unity aceita comunicaçao serial......

[/off-topic]

São funções do C#: http://www.codeproject.com/Articles/22577/Euler-Rotation

Disse que funcionaria pro Evertton, mas realmente a comunicação serial pic pode ser diferente. Nos atmega8/168/328 uso apenas RX-TX. E esses adaptadores que uso fornecem 3,3V e 5V

$T2eC16JHJHEE9ny2p6RtBQWSpcB6eQ~~60_12.JPG

Link para o comentário
Compartilhar em outros sites

então... foi decidido em usar o compurtador do laboratorio na apresentação, ele possui comunicação serial nativa na placa mãe....

Valeu matheus, ainda quero melhorar a parte visual dele. vê se você consegue da uma arrumada naqueles detalhes que eu te falei.

Abração,

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Como meu PC só tem uma porta serial e nela fica o meu gravador de PICs, eu tenho em uma porta USB um cabo USB - Serial da Prolific, como o colega Projetos_afg disse.

Para comunicação ele funciona normal, tanto TX como RX. Nas configurações de hardware ele aparece como uma outra porta serial COM2 ou COM3, dá pra usar pelo HyperTerminal ou por outro programa (eu uso o RComSerial.exe disponível no site do Rogercom).

Só não serve pra gravar PICs, visto que a limitação da porta USB é de 5V.

Matheus_LPS, isso que você disse e o VTRX tb disse me preocupa. Quero aprender a comunicar PICs com a porta USB, até agora só tenho mexido com serial.

você tem algum material ai ou exemplos pra inciantes?

Ao contrário da Serial que já possui alguns programas para visualizar o que é recebido no PC(ex: hyperterminal, RComSerial.exe, etc...), para a porta USB tem algum programa desses tipo? Digo, para fazer testes de envio e recebimento?

USO o CCS.

Falou

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Galera, to ressuscitando o tópico pra dizer que consegui fazer a comunicação serial através de um conversor USB, funcionou muito bem em todos os comandos... valeu pela atenção de todos... abração

 

Depois de mais de um ano... eu conseguiria saber que cabo seria esse... estou com um problema muito parecido e estou achando também que é o meu cabo.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!