Ir ao conteúdo

PIC direto USB


malepobox

Posts recomendados

Postado

Boa noite amigos.

No momento estou usando um Pic 16F628a e enviando sinais para as entradas, para acionar saídas, via Delphi e cabo conversor USB para Paralela.

Esse cabo conversor usa um FT232 e gostaria de poder evitar isso.

Na verdade, preciso acionar/desacionar 6 entradas, que vão acionar/desacionar 6 saídas.

Mas preciso fazer isso via USB, direto em um PIC (pode ser outro modelo de PIC)

Alguém poderia ajudar?

Postado

Olá VTRX

Esse executável que você postou?

É em Delphi e faz a comunicação?

Como minha aplicação é específica, se você pudesse postar o hardware PIC para USB e o protocolo em Delphi (se for isso que tem) ajudaria bastante, porque vou ter que adaptar na aplicação.

Se puder ajudar. agradço

Grde abraço

Postado

Eu postei o projeto com código e componente.

Primeiro instale o componente,depois diga qual linguagem e compilador esta usando.

voce pode tambem,postar um mínimo do programa que fez(Delphi) que eu adapto para voce entender como se comunica diretamente com USB/HID.

Postado

Olá VTRX.

Agradeço sua resposta.

Seguinte.

Já fiz comunicação com o Delphi e Pic, via RS232.

O componente que usei não é o Comport.

É um componente que comprei em um site Russo, chamado Nrcomm

Tenho todos o protocolo para entradas analógicas e digitais, e saídas digitais.

Será que esse bixo serve neste caso?

Falo isso porque já estou acostumado com ele, caso contrário, parto para o que você fez, se bem que não tenho a mínima experiência com esse componente.

O que preciso é coisa simples (para quem sabe, é claro)

Vou acionar 6 servos (desses de aeromodelismo), nas saídas do pic, através

de 6 entradas.

As entradas sempre estão para +5V e o servo na posição ZERO

Quando aterro cada e entrada (GND), o servo vai para a posição 180º

Se retiro GND, volta para posição ZERO.

Isso aqui, já fiz no 16F628a e estava usando um cabo USB/Paralela para acionar

A saída paralela foi ligada em um ULN2804 para inverter e enviar GND para as entradas do pic

No caso, quem vai acionar/desacionar as entradas, é o Delphi

Ops...Uso o CCS para compilar

O que quero fazer é eliminar esse cabo Usb/Paralela. (as rotinas para oi Delphi aqui, são diferentes do protocolo RS232 que mencionei no começo

Meu problema é só a rotina no Delphi para conversar com USB.

Ops... Uso o Delphi7.

N]ão fiz nada ainda no Delphi para essa aplicação.

Não sei se interessa as rotinas antigas que tenho....

Caso sim, monto umas procedures e posto para você ver.

Grato pela resposta e tenha um bom dia.

Postado

cara, me passa seu e-mail que te envio um esquema muito bacana.... muito de boa a comunicação, você coloca seus bytes num bloco de 64 e send... e do outro lado é só receber essa pancadinha de bytes, e vice versa. Dispositivo HID, você pluga no PC ele já reconhece, aparece seu nome no rodapé " dispositivo NOME instalado, pronto para usar" algo assim rsrs.

Postado

Tem certeza que sabe programar em Delphi?

Te mandei um exemplo onde voce primeiro instala o componente de acesso(HidController.dpk).

Se ja programou em Delphi,deve saber que a instalação é muito simples.

Funciona com todos os Windows.

se fosse clickar em um botão para comandar algo pela USB usaria;

procedure TForm1.Button5Click(Sender: TObject);
begin
Controle:=$35;//Hexa 31 = ASCII (1) //CRIE SEU COMANDO
if Assigned(CurrentDevice) then Envia_Comando;
end;

Onde 'Envia_Comando seria;

procedure TForm1.Envia_Comando;
var
I: Integer;
Buf: array [0..8] of Byte;
// buf: array [0..64] of Byte;
Written: Cardinal;
ToWrite: Cardinal;
Str: string;
Err: DWORD;
begin
if Assigned(CurrentDevice) then
begin
ToWrite := CurrentDevice.Caps.OutputReportByteLength;
///////////////////////////////////////////////////////////////
buf[0] := ToInt('0');//NA CLASSE HID O PRIMEIRO BYTE É ZERO(ReportID)
buf[1] := Controle;//Controle;// PRIMEIRO BYTE DO PACOTE
buf[2] := ToInt(Edit2.Text);
buf[3] := ToInt(Edit3.Text);
buf[4] := ToInt(Edit4.Text);
buf[5] := ToInt(Edit5.Text);
buf[6] := ToInt(Edit6.Text);
buf[7] := ToInt(Edit7.Text);
buf[8] := ToInt(Edit8.Text);
written := 0;
if not CurrentDevice.WriteFile(Buf, ToWrite, Written) then
begin
Err := GetLastError;
ShowMessage(Format('ERRO DE ESCRITA: %s (%x)', [SysErrorMessage(Err), Err]));
end
end;
end;

É ilimitado o modo de usar.

voce prcisa definir quantos bytes vai querer para comandar algo.

Sua dúvida está muito 'genérica'.

Postado

Prezado Vtrx.

Se der alguma encrenca por aqui, peço um help.

Com respeito ao Delphi, há muita a explorar e te asseguro que não sei tudo.

Sempre tem muita coisa à aprender.

Te agradeço a resposta.

Uma boa noite e + uma vez, grato pela ajuda.

Olá Paulo Thomazelli

Te agradeço a resposta.

Recebi seu comentário via e-mail... O mesmo está funcionando.

Se puder enviar os arquivos, te agradeço

Se precisar algo em mecânica, posso ajudar.

Valeu

Postado

Olá Vtrx.

Grato pela resposta.

Preciso adaptar ele para o 18F2550 e acionar/desacionar as entradas (fim do código) através do Delphi.

O acionamento das entradas precisa ser independente.

O acionamento, é feito enviando GND para acionar, e desligando GND para desacionar.

Quando a entrada nãoe stá aterrada, o servo fica na posição ZERO

Quando aterro essa entrada (GND) vai para 180º

Hoje uso um cabo usb/Paralela (ao acionar, sai + nos terminais).

Aí usei um ULN2804 para inverter e liguei os pinos de saída dele nas entradas do pic.

Segue o código que uso no 16F628a.

Se puder ajudar, te agradeço.

Abraços

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES PROTECT //Code protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=20000000)

int1 teste = 0;
unsigned int servo_0 = 0, servo_1 = 0, servo_2 = 0, servo_3 = 0, servo_4 = 0, servo_5 = 0;
unsigned int16 tempo = 0;

//unsigned int : declara uma variável inteira de 8 bits, sem sinal, e inicia com valor zero
//unsigned int16 : declara uma variável inteira de 16 bits, sem sinal, e inicia com valor zero

#int_RTCC
void RTCC_isr(void)
{

set_timer0(5 + get_timer0());

tempo++;

if(tempo >= 10 + servo_0) output_low(pin_a1); // 50uS
if(tempo >= 10 + servo_1) output_low(pin_a0); // 50uS
if(tempo >= 10 + servo_2) output_low(pin_b7); // 50uS
if(tempo >= 10 + servo_3) output_low(pin_b6); // 50uS
if(tempo >= 10 + servo_4) output_low(pin_b5); // 50uS
if(tempo >= 10 + servo_5) output_low(pin_b4); // 50uS


// se a variavel tempo for igual a 400, então leva a nivel alto as saídas para serem zeradas na comparação anterior
// 400 * 50 microsegundos = 20 milisegundos = 50 hertz
if(tempo == 400)
{
tempo = 0;
output_high(pin_a1);
output_high(pin_a0);
output_high(pin_b7);
output_high(pin_b6);
output_high(pin_b5);
output_high(pin_b4);
}
}

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);

while(true)
{

/*
valores ajustados para o SERVO-MOTOR TURNIGY 9Ge

servo_x = 0 para 0º
servo_x = 24 para 90º
servo_x = 36 para 180º

assim:

if(tempo >= 12 + servo_x) output_low(pin_xx);

servo_x = 0 para 0º -> 12 + 0 = 12 -> 12 * 50 micro segundos = 600 micro segundos = 0.6 ms
servo_x = 24 para 90º -> 12 + 24 = 36 -> 36 * 50 micro segundos = 1800 micro segundos = 1.8 ms
servo_x = 36 para 180º -> 12 + 36 = 48 -> 48 * 50 micro segundos = 2400 micro segundos = 2.4 ms


*/

if(input(pin_a2) == 1 ) servo_0 = 36; // 180 graus
else servo_0 = 0; // -90 graus

if(input(pin_a3) == 1 ) servo_1 = 36; // 180 graus
else servo_1 = 0; // -90 graus

if(input(pin_a4) == 1 ) servo_2 = 36; // 180 graus
else servo_2= 0; // -90 graus

if(input(pin_b0) == 1 ) servo_3 = 36; // 180 graus
else servo_3 = 0; // -90 graus

if(input(pin_b1) == 1 ) servo_4 = 36; // 180 graus
else servo_4 = 0; // -90 graus

if(input(pin_b2) == 1 ) servo_5 = 36; // 180 graus
else servo_5 = 0; // -90 graus

teste = !teste; // inverte o valor binário de 0 para 1 e 1 para 0
output_bit(pin_b3, teste); // coloca o pino b_3 no nivel correspondente.... Aqui coloquei
//um led para sinalizar o funcionamento

delay_ms(250);
}

}

Postado

Prezado Vtrx.

Bom dia....

Apenas envio comandos pela USB, via Delphi, para acionar/desacionar os pinos D0 à D5 da saída Paralela (conector USB/Paralela.

Os servos sempre estão para +VCC no Gate e posição ZERO

Se acionar qq uma das entradas (pic), com GND, mando o servo para 180º.... Só isso.

Quando desligo GND, vai para VCC e o servo volta à ZERO.

Não há troca de dados do tipo, você envia uma string e recebe um valor.

Se você quiser enviar ums string (A, b, C, etc e receber um valor analógico, por exemplo, ler entradas e acionar saídas) fiz isso pela serial com Delphi.

Se este for seu caso, escreva que monto as procedures e posto.

Aproveitando o gancho, instalei o componente USB que baixei de seus arquivos no 4Shared.

Como defino as propriedades do componente?????

Preciso adaptar a rotina que você postou para ligar/desligar 6 entradas.

Pode postar essas procedures no Delphi?

Grde abraço.

Postado

Aguarde que estpo adaptando seu código para 18F2550.

Como defino as propriedades do componente?????

De uma olhada no exemplo,nos fontes,que voce verá.

A única coisa que voce tem que fazer,é colocar as rotinas nos seu lugares,digo as rotinas do componente.

De uma adiantada no programa Delphi,faça as telas e botões do jeito que imagina,e deixe as rotinas comigo.

Postado

Olá Vtrx.

Te agradeço a resposta e a ajuda.

Fiz algo bem simples com 12 botões.

São dois botões para cada entrada

Um aciona uma entrada e o outro desciona a mesma entrada.

Assim para 6 entradas (2 botões cada)

Caramba.... não tô vendo aqui como anexo o arquivo... se é que dá para fazer isso)

Te agradeço + uma vez pela força

Se precisar algo em minha área, só postar ou enviar msg (caso não seja pertinente ao fórum)

Postado

É esse mesmo,mas pode tentar [email protected].

Seguinte,montei para voce porque sei que a primeira vista programar algo elaborado usando HID+Delphi e 18F2550 na primeia vez,pode não ser fácil.

O Firmware e Software(PC Delphi) está 'pronto'.

Mas existem pontos qur voce vai ter que resolver...

Monte o Hardware mínimo para o 18F2550 funcionar em USB,o firmware esta programado para um cristal de 4 MHZ(bem comum) e USB FullSpeed.

Não sei se a rotina

void RTCC_isr(void)
,funciona no 18F2550.

voce vai ter que recalcular o tempo das rotinas que tem base no clock do PIC,pois o 18F2550 vai estar a 48 MHZ.

BOm divertimento.

Postado

Olá Vtrx.

O board esta montado.

Só não defini no hardware as entradas e saídas.

A pinagem definida no software PIC 16F628 que postei, pode ter alteração na pinagem, em relação ao 18F2550.

Te enviei um exemplo simples em Delphi (só form e botões+ o comp. USB) via e-mail, mas não sei se você recebeu (pelo menos não deu delivery)

Se puder enviar o arquivo C modificado e o arquivo em Delphi, essa parte que você mencionou para ajustes, tento fazer por aqui.

Fico no aguardo de sua postagem ou e-mail.

Desde já agradeço pela força.

Postado

Não conseguí enviar direto para seu Email!.

Vou postar umLink genérico,mas vai ter que adaptar bastante coisa no PIC.

Como você faz para ler uma entrada analógica e digitais pelo Delphi e PIC/USB??

Pode dar uma luz?

A comunição sendo RS232,USB ou outra é a mesma,isto é,voce vai receber bytes pela USB em pacotes de no máximo, na classe HID e pelo WIn 7 a fullspeed ,de 64K.

O XP aceita pacotes muito maiores na classe HID,mas aí o dispositivo não vai ser reconhecido pelo Win 7.

Conforme texto que não chegou no seu Email,segue o texto;

"Aqui estão os arquivos,mas provavelmente vai ter problemas com os 'timings' no PIC pois o clock vai ser de 48 mHZ.

O Hardware voce deve procurar na net,é simples,cristal de 4 Mhz mais capacitor no pino 14.

O programa no Delphi está Ok,clike nos botões mandam um byte para o PIC que verificar se é para 'zerar' a variavel 'servo_X' ou carregá-la com 36.

Quando executar o programa Delphi,se algum dispositivo HID estiver conectado no PC,ele vai aparecer no ListBox,então voce deve dar um click no nome do dispositivo(no ListBox)para ele conectar."

-> Projeto para adaptar<-

Postado

Olá Vrtx

Baixei os arquivos.

Vou tentar fazer as modificações que você orientou.

Se der éca, peço um help

Esse e-mail tá certo..... [email protected]

Caramba.... Não sei porque esse e-mail tá fazendo isso.

você não é o único que teve problemas de envio.

Vou criar uma conta em outro provedor e te envio um e-mail de emergência.

Grde abraço e grato + uma vez pela força.

Se precisar algo na minha área, escreve.

Valeu a força.

Postado
Como você faz para ler uma entrada analógica e digitais pelo Delphi e PIC/USB??

Pode dar uma luz?

Se voce executar o programa e conectar um controle USB,ele vai ser listado no ListBox,então voce seleciona o joystick(click no Listbox em cima do dispositivo) e quando apertar os botoões,vai ter os bytes recebidos do Joystick.

Se fosse seu circuito enviando o resultado de controles analógicos ou digitais,a resposta seria parecida.

Postado

Olá Vtrx

Agradeço a resposta.

Já vou começara fazer os testes.

Tenho que tentar entender tudo o que você fez.

Mas se tiver alguma dúvida, escrevo.

Grde abraço e agradeço pela força

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!