Gracias a todas tus recomendaciones, seguí con mi proyecto usando el USB en Ubuntu 18.04, para lo cual ya había elaborado un prototipo usando un PIC18f13k50 para recoger los valores de 3 sensores (Temperatura, Voltaje y Cantidad de Luz ambiental) y enviar esta información por USB a un programa en VB6 en Win2. Pero ahora lo he logrado hacer en Linux.
Bien, habiendo realizado un 90% del proyecto, estoy anexando: Un listado del programa en Cpp del proyecto PIC18f13k50, Un listado del Programa en GAMBAS3, un pantallazo del IDE en Linux.
[img]/home/usuario/Documentos/Usb_TempVolt/Captura de pantalla de 2020-12-28 11-09-16.png[/img]
Código:
/* Programa con el 18f13k50 que se utiliza como sensor de intensidad de luz, temperatura y voltaje,
a traves de dos entradas analógicas, enviando la información por USB a una PC o Laptop,
desde donde se podrá consultar dichos valores a petición de un usuario o de manera periodica
en forma automática. Se usa un LED blanco, como sensor de luz, ya que este dispositivo,
cuando es iluminado presenta en sus terminales un voltaje, proporcional a la intensidad de la luz incidente.
Se pone un botón en rc5 para enviar desde el PIC18 hacia la PC la información delos sensores.
(El modo de envío automático se deshabilita). En la aplicación de VB6 se coloca un botón para solicitar
datos al PIC18, enviando un valor numérico en el packet el cual debe ser reconocido por el PIC18.
VendorID = 6019, ProductID = 2003 Alfredo Segura, Queretaro, Mexico, noviembre de 2020.*/
#include <18F13k50.h>
#fuses HS,NOWDT,NOPROTECT,NOCPB,NOLVP,NODEBUG,MCLR,CPUDIV1,PLLEN,USBDIV1,NOIESO,PUT
#use delay(clock = 48000000)
//utiliza un XTAL de 12 MHz, para que con PLL arroje 48MHz
#define USB_HID_DEVICE TRUE // Deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK // Activa EP1(EndPoint1) para las transferencias IN Bulk/Interrupt
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK // Activa EP1(EndPoint1) para las transferencias OUT Bulk/Interrupt
#define USB_EP1_TX_SIZE 8 // Tamaño reservado para el Buffer Tx EndPoint1
#define USB_EP1_RX_SIZE 8 // Tamaño reservado para el Buffer Rx EndPoint1
#include <pic18_usb.h>
#include <hid_analog2.c> // Configuración del USB y los descriptores para este dispositivo
#include <usb.c> // Handles usb ,tokens y descriptores
// Se declara el nombre a cada uno de los 8 elemento del vector recibe[8]
#define dato0 recibe[0]
#define dato1 recibe[1]
#define dato2 recibe[2]
#define dato3 recibe[3]
#define dato4 recibe[4]
#define dato5 recibe[5]
#define dato6 recibe[6]
#define dato7 recibe[7]
// Se declara el nombre a cada uno de los 8 elemento del vector envia[8], enviar_n
#define enviar_0 envia[0]
#define enviar_1 envia[1]
#define enviar_2 envia[2]
#define enviar_3 envia[3]
#define enviar_4 envia[4]
#define enviar_5 envia[5]
#define enviar_6 envia[6]
#define enviar_7 envia[7]
#use fast_io(A) // LATA=0xF89 PORTA=0xF80, 5 I/O pins
#use fast_io(B) // LATB=0xF8A PORTB=0xF81, 4 I/O pins
#use fast_io(C) // LATC=0xF8B PORTC=0xF82, 8 I/O pins
#byte ptoa = 0xf80#byte ptob = 0xf81
#byte ptoc = 0xf82
#byte lata = 0xf89
#byte latb = 0xf8a
#byte latc = 0xf8b
#bit ra0 = 0xf89.0 // D+ de USB
#bit ra1 = 0xf89.1 // D- de USB
// ra3 es MCLR
// ra4 y ra5 XTAL 12MHz
#bit rb6 = 0xf8a.6 // rb6 salida LED de conexión establecida
#bit rb7 = 0xf8a.7 // rb7 salida LED de actividad
#bit rc3 = 0xf82.3 // Sensor Luz con LED Blanco
#bit rc5 = 0xf82.5 // Botón para iniciar envío de datos a una PC
#bit rc6 = 0xf82.6 // Sensor Voltaje#bit rc7 = 0xf82.7
// Sensor Temperatura int8 recibe[8];
// Declaramos la variable recibe de 8 bytes
//int info0 = 0, info1, info2, info3, info4, info5, info6, info7;
int8 envia[8]; // Declaramos la variable envia de 8 bytes
int info[8] = {0,0,0,0,0,0,0,0};
int i, j, volts = 0, tempe = 0, luz = 0;
int volts_ant, tempe_ant, luz_ant;
int1 flag = 0, flag2 = 0;long k = 0;
#int_timer0void actividad(void) {
i++;
k++;
if (i >= 190) {
rb7++; // LED de actividadi = 0;
}
if (k >= 1500) {
flag2 = 1;
k = 0;
}
set_timer0(0);
}
void ini(void) {
enable_interrupts(global);
disable_interrupts(int_timer0);
setup_timer_0(t0_internal | t0_div_1);
setup_adc(adc_clock_internal);
setup_adc_ports(sAN7 |sAN8 | sAN9 | vss_vdd);
set_tris_a(0b11101111); // XTAL, D+, D-, MCLRset_tris_b(0b00001111);
// rb6 Enumerado, rb7 LED de actividadset_tris_c(0b11101000);
// rc3, rc6 y rc7 entradas analogicas.
usb_init(); // Inicializa USB
delay_ms(100);
ptoa = 0x00, ptob = 0x00, ptoc = 0xbf;
set_timer0(0);
}
void main(void) {
ini();
delay_ms(100);
usb_task(); ///habilita USB
usb_wait_for_enumeration(); ///Espera hasta que la PC reconozca este dispositivo
rb6 = 1;
enable_interrupts(int_timer0);
while(true) {
if(usb_kbhit(1)) { // Se reciben dati[0,2,4,6,8,10,12] de una sola vez
usb_get_packet(1, recibe, 8);
info[0] = dato0;
info[1] = dato1;
info[2] = dato2;
info[3] = dato3;
info[4] = dato4;
info[5] = dato5;
info[6] = dato6;
info[7] = dato7;
delay_us(10);
flag = 1;
}
if (flag == 1) { // Se ha recibido un MSG USB válido
if (info[2] == 49) { // Verificar si infa[2] == 49, indica petición de informe
flag = 0;
goto DISPARO;
}flag = 0;
}
if (rc5 == 0) {
DISPARO:set_adc_channel(7); // Prepara AN8 para leer Votaje
luz = read_adc();
delay_us(50);
set_adc_channel(8); // Prepara AN8 para leer Votaje
volts = read_adc();
delay_us(50);
set_adc_channel(9); // Prepara AN9 para leer Temperatura
tempe = read_adc();
delay_us(50);
enviar_0 = 255;
enviar_1 = volts;
enviar_2 = 255;
enviar_3 = Tempe;
enviar_4 = 255;
enviar_5 = luz;
enviar_6 = 255;
enviar_7 = 255;
//usb_put_packet(int8 endpoint, int8 * ptr, unsigned int16 len, USB_DTS_BIT tgl)
usb_put_packet(1, envia, 8, usb_dts_toggle);
do {
delay_us(50);
j++;
} while (rc5 == 0);
}
if (flag2 == 1) { // Monitorea sensores en forma automática
set_adc_channel(7); // Prepara AN8 para leer Votaje
luz = read_adc();
delay_us(50);
set_adc_channel(8); // Prepara AN8 para leer Votaje
volts = read_adc();
delay_us(50);
set_adc_channel(9); // Prepara AN9 para leer Temperatura
tempe = read_adc();
delay_us(50);
if (luz != luz_ant) {
luz_ant = luz;
flag2 = 0;
goto DISPARO;
}
if (volts != volts_ant) {
volts_ant = volts;
flag2 = 0;
goto DISPARO;
}
if (tempe != tempe_ant) {
tempe_ant = tempe;
flag2 = 0;
goto DISPARO;
}flag2 = 0;
} delay_us(100);
}
}
Código:
' Gambas class file
Public Const VendorID As Integer = 6019 '0x1783
Public Const ProductID As Integer = 2003 '0x07D3
Public BufferOut As New Integer[32]
Public BufferIn As New Integer[32]
Public usb_Bit As New Integer[32]
Public usb_B0 As Short
Public usb_B1 As Short
Public usb_B2 As Short
Public usb_B3 As Short
Public usb_B4 As Short
Public usb_B5 As Short
Public usb_B6 As Short
Public usb_B7 As Short
Public usb_B8 As Short
Public usb_B9 As Short
Public usb_B10 As Short
Public usb_B11 As Short
Public usb_B12 As Short
Public usb_B13 As Short
Public usb_B14 As Short
Public usb_B15 As Short
Public usb_B16 As Short
Public usb_B17 As Short
Public usb_B18 As Short
Public usb_B19 As Short
Public usb_B20 As Short
Public usb_B21 As Short
Public usb_B22 As Short
Public usb_B23 As Short
Public usb_B24 As Short
Public usb_B25 As Short
Public usb_B26 As Short
Public usb_B27 As Short
Public usb_B28 As Short
Public usb_B29 As Short
Public usb_B30 As Short
Public usb_B31 As Short
Public hProc As Process
Public puerto_usb As String
Public usb_insertado As Process
Public j As Integer
Public flag As Boolean
Public Sub cmdMonitor_Click()
Dim N As Integer
For N = 0 To 31
BufferOut[N] = 255
Next
BufferOut[0] = 0
BufferOut[3] = 49 ' este es el Disparador para pedir datos al PIC18
WriteSomeData()
End
Public Sub Form_Open()
'On Error Resume Next
' no quitar!
'ConnectToHID (Me.hwnd)
txtConectar.Text = "No"
cmdConectar.Enabled = True
Timer1.Enabled = True
Timer1.Delay = 1000
Me.Left = 1200
Me.Top = 100
End
Public Sub cmdConectar_Click()
lblvid.Text = VendorID
lblPid.Text = ProductID
txtConectar.Text = "SI"
cmdConectar.Enabled = False
puerto_usb = txtPuertoS.Text
Try usb_insertado = Exec ["cat", puerto_usb] For Read Write As "Display"
Wait 1
End
Public Sub Form_Close()
lblVid.Text = "NO VID"
lblPid.Text = "NO PID"
End
Public Sub Display_Read()
Dim Mm As Integer
txtDatos.Text = ""
' El primer byte es el ID del reporte, ej. BufferIn(0)
' los demás bytes son los datos del microcontrolador
' Los valores se reciben en DECIMAL
' Leer los nuevos datos del Display
Read #usb_insertado, usb_B0
Read #usb_insertado, usb_B1
Read #usb_insertado, usb_B2
Read #usb_insertado, usb_B3
Read #usb_insertado, usb_B4
Read #usb_insertado, usb_B5
Read #usb_insertado, usb_B6
Read #usb_insertado, usb_B7
Read #usb_insertado, usb_B8
Read #usb_insertado, usb_B9
Read #usb_insertado, usb_B10
Read #usb_insertado, usb_B11
Read #usb_insertado, usb_B12
Read #usb_insertado, usb_B13
Read #usb_insertado, usb_B14
Read #usb_insertado, usb_B15
Read #usb_insertado, usb_B16
Read #usb_insertado, usb_B17
Read #usb_insertado, usb_B18
Read #usb_insertado, usb_B19
Read #usb_insertado, usb_B20
Read #usb_insertado, usb_B21
Read #usb_insertado, usb_B22
Read #usb_insertado, usb_B23
Read #usb_insertado, usb_B24
Read #usb_insertado, usb_B25
Read #usb_insertado, usb_B26
Read #usb_insertado, usb_B27
Read #usb_insertado, usb_B28
Read #usb_insertado, usb_B29
Read #usb_insertado, usb_B30
Read #usb_insertado, usb_B31
' Distribuir los datos leidos en las acciones correspondientes
BufferIn[0] = usb_B0
BufferIn[1] = usb_B1
BufferIn[2] = usb_B2
BufferIn[3] = usb_B3
BufferIn[4] = usb_B4
BufferIn[5] = usb_B5
BufferIn[6] = usb_B6
BufferIn[7] = usb_B7
BufferIn[8] = usb_B8
BufferIn[9] = usb_B9
BufferIn[10] = usb_B10
BufferIn[11] = usb_B11
BufferIn[12] = usb_B12
BufferIn[13] = usb_B13
BufferIn[14] = usb_B14
BufferIn[15] = usb_B15
BufferIn[16] = usb_B16
BufferIn[17] = usb_B17
BufferIn[18] = usb_B18
BufferIn[19] = usb_B19
BufferIn[20] = usb_B20
BufferIn[21] = usb_B21
BufferIn[22] = usb_B22
BufferIn[23] = usb_B23
BufferIn[24] = usb_B24
BufferIn[25] = usb_B25
BufferIn[26] = usb_B26
BufferIn[27] = usb_B27
BufferIn[28] = usb_B28
BufferIn[29] = usb_B29
BufferIn[30] = usb_B30
BufferIn[31] = usb_B31
For Mm = 0 To 15
txtDatos.Text = txtDatos.Text & " " & BufferIn[Mm]
Next
txtDatos.Text &= Chr$(13)
For Mm = 16 To 31
txtDatos.Text = txtDatos.Text & " " & BufferIn[Mm]
Next
sldLuz.Value = Abs(BufferIn[22]) ' Luz
sldVolts.Value = Abs(BufferIn[6]) ' Voltaje
sldTempe.Value = Abs(BufferIn[14]) ' Temperatura
txtDatos.Text = txtDatos.Text & Chr$(13)
For Mm = 0 To 31
BufferIn[Mm] = 0
Next
End
Public Sub WriteSomeData()
'On Error Resume Next
BufferOut[0] = 0 ' El primer byte es siempre el REPORTE ID
Dim Mm As Integer
'For Mm = 0 To 7
' Escribe los datos, sin olvidar pasar el arreglo completo
Try Exec ["outb", puerto_usb, BufferOut]
Wait
'Next
txtDatos2.Text &= Str$(BufferOut) & Chr$(13) & Str$(BufferIn)
End
Public Sub cmdBorrar_Click()
txtDatos.Text = ""
End
Public Sub Timer1_Timer()
If cmdVivo.Background = Color.Green Then
cmdVivo.Background = Color.Gray
Else
cmdVivo.Background = Color.Green
End If
End
Public Sub cmdSalir_Click()
Quit
End