Probleme mit Synapse - USB Serial

Rund um die LCL und andere Komponenten
Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Danke für den Hinweis, ich habe mir jetzt halt noch 10 weitere Nanos gekauft. Beim "Ardunio pro micro Clone"
ist soweit ich weiß, leider keine 3,3 Volt, jeden falls bei den die ich habe... bin mir aber gerade nicht 100% sicher.

Dann besitzt du schon solche.
Brauchst du für deine Sensoren 3.3V ?
Ich finden den pro micro einfacher, vor allem bei der Serial-Kommunikation, da ist zB. die eingestellte Baudrate egal, schätzungsweise ist die Übertragungsgeschwindikeit etwas höher als 2'000'000 Baud von einem UART.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Dann besitzt du schon solche.

Ich glaube ich habe Pro Mini der Unterschied ist soweit ich es verstanden habe, die Pro Mini's verwenden ein atMega328 und die Micros ein atmega32u4.
Bei beiden Varianten gibt es Versionen die auch 3,3 Volt haben, die kosten gleich mehr.

Brauchst du für deine Sensoren 3.3V ?

Nun, die LCD'S brauchen welche. Im Moment verwende ich Nokia 5110 LCD.... Davon gibt es mehrer Varianten. Eine davon kann auch direkt mit 5 Volt umgehen....
Nur dann müsste ich Komplett neue Platinen erstellen...
(habe ich sowieso vor, weil ich ein anders LCD verwenden möchte: ST7735S, dieses LCD ist auch nur 3,3 Volt Tolerant)
Nun, ich verwende die Nano's weil die beide Spannungen anbieten(5 Volt und 3,3 Volt).

Ich könnte es auch mit einem Spannungsteiler versuchen.

Ich finden den pro micro einfacher, vor allem bei der Serial-Kommunikation, da ist zB. die eingestellte Baudrate egal, schätzungsweise ist die Übertragungsgeschwindikeit etwas höher als 2'000'000 Baud von einem UART.

Mir ist aufgefallen, dass die pro micro's wie die Nanos gleich ein USB Anschluss haben, was ich praktisch finde.

Ich werde mal ein Original Arduino Uno verwenden für ein Tests: Hier läuft ja auch ein atMega32u noch was....

Ich hatte halt gehofft das es ein Software Problem sein könnte.
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

die Pro Mini's verwenden ein atMega328 und die Micros ein atmega32u4.

Genau, das ist grosse Unterschied, der pro micro hat den gleichen Chip wie der Leonardo. Und dort ist der USB direkt mit dem Chip verbunden. HID sollte der auch können, habe es aber nie probiert.

Nun, ich verwende die Nano's weil die beide Spannungen anbieten(5 Volt und 3,3 Volt).

So als kleine Info, die 3.3V rauschen bei den China-Nachbauten. Somit schlecht geeignet für Sensoren, die als Spannungsteiler arbeiten.

Ich werde mal ein Original Arduino Uno verwenden für ein Tests: Hier läuft ja auch ein atMega32u noch was....

Ich denke, der ist kaum besser als ein Nano.
Was ich schon gemacht habe, einen Atmega328 direkt auf Schaltung zu bauen. Programmiert habe ich dann über ISP.
Dies ist natürlich nur interessant, wen man keine COM-Übertragung braucht. Aber mit I²C hervorragend.

So nebenbei bin ich gerade mit einem due am basteln, die eierlegende Wollmilchsau. :mrgreen:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

So als kleine Info, die 3.3V rauschen bei den China-Nachbauten. Somit schlecht geeignet für Sensoren, die als Spannungsteiler arbeiten.

Bis jetzt klappt es ganz gut am LCD. Vielleicht hatte ich auch nur Glück.

Ich denke, der ist kaum besser als ein Nano.

Doch, weil er ein Original ist. Der kostet um die 24€. Da erwarte ich einfach das er auch besser ist. Ich habe auch Clone für 2,50€ gekauft.
Beim Original ist als Uart wie gesagt ein atMega32u8 oder so verbaut. Also auch die U-Serie.

Oder meinst du, weil hier zwei Chips Verwendet werden? Einmal ein uart und einmal die eigentliche MCU?

Was ich schon gemacht habe, einen Atmega328 direkt auf Schaltung zu bauen. Programmiert habe ich dann über ISP.

Habe ich auch schon gemacht, bis mir aufgefallen sind, dass es Günstiger ist so ein Board in China zu bestellen als es selbst zu bauen. Die atMega's werden bei reichelt immer teuer.

Dies ist natürlich nur interessant, wen man keine COM-Übertragung braucht. Aber mit I²C hervorragend.

Ich dachte auch erst an I²C, aber hier muss man ständig Pollen, dass mag ich nicht. Ich möchte einfach nur "lauschen" ob was anliegt.

Klar ich könnte auch SPI oder sowas nehmen.

Ich wollte erst mal das vermeintliche einfache verwenden: USB. Hier habe ich Strom und Datenleitungen.
Wenn USB wirklich ein Problem sein sollte, werde ich natürlich mir was anders anschauen. Ich habe mir auch schon überlegt alles über Seriell zu verbinden und Quasi ein Seriellen HUB zu bauen.

So nebenbei bin ich gerade mit einem due am basteln, die eierlegende Wollmilchsau.

Ein DUE finde ich jetzt etwas übertrieben für meine zwecke...
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Beim Original ist als Uart wie gesagt ein atMega32u8 oder so verbaut. Also auch die U-Serie.

Da muss ich dich leider enttäuschen, dem normalen Arduino (uno), dort ist ein Atemga328 verbaut, egal ob von China oder Original.
Das einzige, auf dem Original, ist ein anderer UART verbaut.
Wen du eine U-Serie willst, dann musst du den Leornado oder den pro micro nehmen, egal ob China oder Original.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Da muss ich dich leider enttäuschen, dem normalen Arduino (uno), dort ist ein Atemga328 verbaut, egal ob von China oder Original.
Das einzige, auf dem Original, ist ein anderer UART verbaut.

Genau das habe ich ja gemeint:
Als uart ein atMega32u noch was und als Programmierbare MCU ein atMega328. Das ist ein bedeutsamer unterschied zu den China Teilen finde oder?

Wen du eine U-Serie willst, dann musst du den Leornado oder den pro micro nehmen, egal ob China oder Original.

Ja, sieht fast so aus. Ich habe schon nach einem uart gesucht der NUR auf ein atMega32u basiert, aber in der Regel werden die nur als Board's verkauft.
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Ich habe schon nach einem uart gesucht der NUR auf ein atMega32u basiert,

Die U-Serie, braucht keinen UART.

Als uart ein atMega32u noch was und als Programmierbare MCU ein atMega328

Verstehe ich es richtig, du willst mit einem atMega32u ein /USB-Interface für den Atmega328 bauen ?
Dann würde ea aber keine Rolle spielen, wen es China-Modell ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Die U-Serie, braucht keinen UART.

Ja, ich weiß. Aber ich dachte, es gebe ein UART der auf ein atMega32u Basieren würde. Dann würde er vielleicht stabiler laufen. Nur so als Idee.

Verstehe ich es richtig, du willst mit einem atMega32u ein /USB-Interface für den Atmega328 bauen ?

Ich nicht, aber so ist das beim Arduino UNO. beim Orignal.
Hier wird ein Atmega32u verwendent und ein atMega328 als Haupt MCU.
Genau so wird das beim Uno z.b. gemacht. Das möchte ich nicht bauen.... Das gibt es ja schon.

Ich glaube wir reden/schreiben gerade aneinander vorbei.....
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Ich nicht, aber so ist das beim Arduino UNO. beim Orignal.
Hier wird ein Atmega32u verwendent und ein atMega328 als Haupt MCU.

Du hast recht, da sind tatsächlich 2 Atmegas verbaut. :shock:
Ich dachte, da sei ein FT232R verbaut. :oops:

http://www.adrirobot.it/arduino/arduino ... no_Uno.pdf
http://www.adrirobot.it/arduino/arduino ... no_UNO.htm
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Du hast recht, da sind tatsächlich 2 Atmegas verbaut. :shock:
Ich dachte, da sei ein FT232R verbaut.

der erste Fungiert halt als ein Uart....

Darum der bedeutsame unterschied.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Jetzt war wieder das beschriebe Fehlverhalten. ich glaube:
Das ich nicht gleichzeitig Senden und Empfangen kann. Weißt du oder habt ihr damit schon Erfahrung gemacht?
Weil mir ist aufgefallen, dass gerade Daten Empfangen wurde und ich habe drauf gedrückt.... Das könnte ebenfalls eine Ursache sein.
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Das ich nicht gleichzeitig Senden und Empfangen kann. Weißt du oder habt ihr damit schon Erfahrung gemacht?

Sowas habe ich bis jetzt nie probiert. Aber man könnte versuchsweise im Arduino eine Timer initialisieren, welcher Daten ausgibt.
Und im Loop warten, bis etwas vom PC kommt.
Am PC würde dafür ein einfaches Terminal-Programm reichen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Sowas habe ich bis jetzt nie probiert. Aber man könnte versuchsweise im Arduino eine Timer initialisieren, welcher Daten ausgibt.
Und im Loop warten, bis etwas vom PC kommt.
Am PC würde dafür ein einfaches Terminal-Programm reichen.

Daran habe ich auch schon gedacht, ich habe jetzt erst mal folgendes gemacht:
Das Lazarus Programm fragt alle 5 Minuten die Sensoren ab. Wenn ich per Zufall in der Zeit z.b. eine Taste drücke, könnte es zum Problem kommen.
Daher habe ich jetzt eine Lock Variable eingebaut. Sobald die Sensoren abgefragt werden, werden die Tasten nicht beachtet.
Mal sehen.

Sonst teste ich mal deine Idee.
MFG
Michael Springwald

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Das Lazarus Programm fragt alle 5 Minuten die Sensoren ab. Wenn ich per Zufall in der Zeit z.b. eine Taste drücke, könnte es zum Problem kommen.

Bei meinem Messprogramm habe ich das so gelöst, der Arduino sendet nur Daten, wen ich dem Arduino zuerst etwas sende.

Das sieht bei einer Einzelmessung dann so aus:

Code: Alles auswählen

  ser.SendByte(1)// 1 für Einzeln
  ser.RecvBufferEx(@serbuf, 4, 1000);
 
  Chart1LineSeries1.AddY(serbuf.Sonde);
  Chart1LineSeries2.AddY(serbuf.Poti);   


Oder bei einer Serienmessung, bei welcher der Arduino Daten puffert dann so:

Code: Alles auswählen

procedure TForm1.StartBtnClick(Sender: TObject);
var
  l: UInt16;
 
  tempserBuf: array[0..2050] of TSerBuf;
  max, j, i: integer;
 
begin
  StartBtn.Enabled := False;
  StopBtn.Enabled := True;
 
  Ende := False;
  j:=0;
  ser.SendByte(2)// Serien Messung einleiten
  sleep(2);
 
  while not Ende do begin
 
    sleep(random(1000))// Simuliert ein stotternder PC
 
    Inc(j);
    ser.SendByte(3)// Daten vom Puffer abholen
    ser.RecvBufferEx(@l, 2, 100)// Puffergrösse holen
 
    ser.RecvBufferEx(@tempserBuf, l * 4, 100); // Puffer einlesen
    for i := 0 to l - 1 do begin
      Chart1LineSeries2.AddY(tempserBuf[i].Poti);
      if Chart1LineSeries2.Count > 10000 then begin
        Chart1LineSeries2.Delete(0);
      end;
 
      Chart1LineSeries1.AddY(tempserBuf[i].Sonde);
      if Chart1LineSeries1.Count > 10000 then begin
        Chart1LineSeries1.Delete(0);
      end;
    end;
 
    Application.ProcessMessages;
  end;
 
  sleep(2)
  ser.SendByte(4)// Serienmessung Stop
end;
 
procedure TForm1.StopBtnClick(Sender: TObject);
begin
  StartBtn.Enabled := True;
  StopBtn.Enabled := False;
 
  Ende := True;
end;


Beim Sketch sieht dies so aus:

Code: Alles auswählen

   while (SerialUSB.available() > 0) {
      SerialUSB.readBytes(c, 1);
 
      switch (c[0]) {
      case 1:  // Einzel
         AdcData adc;
         adc.Sonde = readADC(adcConfig.Sonde, i2cAdrSonde);
         adc.Poti = readADC(adcConfig.Poti, i2cAdrPoti);
         SerialUSB.write(PChar(adc), 4);
 
         break;
      case 2:         // Serie
         adcBuf.len[0] = 0;
         adcBuf.len[1] = 0;
         adcBuf.aktBuf = 1;
         adcBuf.newBuf = true;
         Hi_To_Low=0;
         NVIC_EnableIRQ(TC3_IRQn);
         NVIC_EnableIRQ(TC4_IRQn);
 
         messen = true;
 
         break;
      case 3:
         adcBuf.newBuf = true;
 
         delay(1);
         SerialUSB.write(PChar(adcBuf.len[1 - adcBuf.aktBuf]), 2);
         SerialUSB.write(PChar(adcBuf.Data[1 - adcBuf.aktBuf]),
               adcBuf.len[1 - adcBuf.aktBuf] * 4);
 
         break;
      case 4:         // Stop
         NVIC_DisableIRQ(TC3_IRQn); // disable TC0 interrupts
         NVIC_DisableIRQ(TC4_IRQn); // disable TC0 interrupts
 
         messen = false;
 
         break;
      }


Daten hole ich generell immer mit RecvBufferEx(... ab, ausser es sind einzelne Bytes.
Mit anderen Funktion, welche zB. ein ganzer String sendet, hatte ich Ärger.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Bei meinem Messprogramm habe ich das so gelöst, der Arduino sendet nur Daten, wen ich dem Arduino zuerst etwas sende.

habe ich auch so gelöst. Mein Programm auf den Rechner, fragt der reihe nach alle Sensoren ab, in dem es einfach ein Kommando Sendet mit einer bestimmten ID versehen. Die Module Antworten dann und mein Programm verarbeitet das.

// Simuliert ein stotternder PC

Warum ist das wichtig?

Application.ProcessMessages;

das kann ich glaube ich nicht machen, bei einer Konsolen Anwendung.

ser.SendByte(2); // Serien Messung einleiten ser.SendByte(4); // Serienmessung Stop

Die Idee finde ich nicht schlecht nur das ich keine Serie habe.

Daten hole ich generell immer mit RecvBufferEx(... ab, ausser es sind einzelne Bytes.
Mit anderen Funktion, welche zB. ein ganzer String sendet, hatte ich Ärger.

vielleicht liegt es daran.

Ich werde mal einige Tests machen.... vielleicht finde ich den Fehler... habe ja jetzt einige Infos erhalten.
MFG
Michael Springwald

Antworten