Go Down

Topic: Gelöst!!! mehrfache Serielle Verbindung am Arduino Nano IoT SERCOM0, & Serial  (Read 1 time) previous topic - next topic

janpho

Hallo,

ich bin auf ein Problem gestoßen. Googeln hat mein Problem leider nicht lösen können, daher bitte ich um fachkundige Hilfe.

Ich arbeite an einem kleinen Projekt mit dem neuen Arduino Nano IoT. Die Wahl fiel auf diesen, da er klein ist, einen SAMD21 Prozessor hat und WiFi on Board.

Nun konnte ich bereits einen Vorteil des SAMD21 nutzen, so dachte ich, und zwei Geräte gleichzeitig über Hardware Serial ansteuern.

Dazu nutze ich den SERCOM0 Port. Dieser funktioniert auch sehr gut.

Es sieht folgendermaßen aus:

Der Arduino bekommt seinen Strom 5V über USB (Ein USB Kabel an welchen nur der Strom angeschlossen ist!).

Der max3232 bekommt seinen ström über den 3.3V Ausgang des Arduino.
Arduino Nano IoT ->Max3232 ->2x periphere Geräte per RS232
Nebensächlich sind noch ein 74HC595 Shift register sowie ein i2c level converter für ein 16x2 LCD display angeschlossen.


Das Ansprechen des einen peripheren Geräts auf SERCOM0 über RS232 (an Meridian HD621) funktioniert dabei. Es ist per null modem Verkabelung angeschlossen.

Das Ansprechen des zweiten peripheren Geräts mit normalem Arduino Serial über RS232 (an Dolby CP650) funktioniert nicht. (kein null modem Anschluss)

Kann das daran liegen, dass ich das board per USB mit Strom versorge?

Zum Testen habe ich nun meinen eigentlichen Sketch umgeschrieben, um die RS232s zu testen. Also einfach beide RS232 direkt aneinander schließen. Da ja eines der RS232 über kreuz angeschlossen ist, dachte ich das sollte gehen.

der Output am Display ist jedoch nichts.... gar nichts...
Wo ist der Fehler?



Code: [Select]


//_____Librarys__________________________________________________________________________
#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoOTA.h>
#include "arduino_secrets.h"
#include <Arduino.h>
#include "wiring_private.h"
#include <Wire.h>
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>               // LCD over I2C

Uart HD_621_Serial (&sercom0, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0);
const int RECV_PIN = 10;                     // IR Receiver Pin
//const int Interpin = 7;                      // Wake Up Interrupt_Pin
const int latchPin = 2;                      // Pin connected to latch pin (ST_CP) of 74HC595
const int clockPin = 3;                      // Pin connected to clock pin (SH_CP) of 74HC595
const int dataPin = 4;                       // Pin connected to Data in (DS) of 74HC595
//Vorsicht Pn 11 & 12 for I2C Crypto chip


//_______variables_____________________________________________________________________
char ssid[] = SECRET_SSID;      // your network SSID (name)
char pass[] = SECRET_PASS;   // your network password
int status = WL_IDLE_STATUS;

//Variablen_______________________________________________________________

LiquidCrystal_I2C lcd(0x27, 16, 2);       // set the LCD address to 0x27 for a 16 chars and 2 line display
//IRsend irsend;                            // Pin D9!!!!           initialize TV && AppleTV IRremote
IRrecv irrecv(RECV_PIN);                  // setup IR_receiver
decode_results results;
WiFiClient client;
WiFiUDP udp;

//_________SETUP_____________________________________________________________________________
void setup() {
  
  pinMode(latchPin, OUTPUT);                // pinmodes for 74HC595
  pinMode(dataPin, OUTPUT);                 //
  pinMode(clockPin, OUTPUT);                // pinmodes for 74HC595
  pinPeripheral(5, PIO_SERCOM_ALT);         //RX
  pinPeripheral(6, PIO_SERCOM_ALT);         //TX
  irrecv.enableIRIn();                      // initialisiert den Infrarotempfänger.
  Serial.begin(9600);                       // initialize Serial_CP650
  HD_621_Serial.begin(9600);                // initialize Serial_HD621
  lcd.init();                               // initialize the lcd
  lcd.backlight();
  while (WiFi.status() != WL_CONNECTED) {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print(F("Conecting to:"));
              lcd.setCursor(0, 1);
              lcd.print(F("WiFi"));
              status = WiFi.begin(ssid, pass);
              delay(500);
              if (status == WL_CONNECTED) {
                break;
              }
              delay(3000);
            }
      ArduinoOTA.begin(WiFi.localIP(), "Arduino", "password", InternalStorage);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ready");  
}
//______Accessory_Serial_Connection________________________________________________________
void SERCOM0_Handler() {                     // Attach the interrupt handler to the SERCOM
  HD_621_Serial.IrqHandler();
}

void loop() {
  if (irrecv.decode(&results)) {    //Wenn Daten empfangen wurden,
    switch (results.value) {
      case  0x5EA1B04F:                       //YamahaRC backw
          HD_621_Serial.println(F("HD Serial"));
          delay(100);
          lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ok");
          break;
      case  0x5EA130CF:                       //YamahaRC Fwd
          Serial.println(F("SerialSerial"));
          delay(100);
          break;
    }
    irrecv.resume();
  }

  HD_621_Serial.println(F("HD Serial"));
          delay(1000);
 if (Serial.available())
    {
      String st = Serial.readStringUntil('\r');
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(st);    
    }
  if (HD_621_Serial.available())
    {
      String st = HD_621_Serial.readStringUntil('\r');
      lcd.clear();
      lcd.setCursor(0,1);
      lcd.print(st);    
    }
    if(WiFi.status() != WL_CONNECTED) {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print(F("Conecting to:"));
              lcd.setCursor(0, 1);
              lcd.print(F("WiFi"));
              status = WiFi.begin(ssid, pass);
              delay(500);
              
              delay(3000);
            }
    ArduinoOTA.poll();
}




Um das Ganze noch darzustellen:





Arduino                                Max 3232                                                                       DB9
Name     Pin Numm       | Name In Pinnum   |  Name  Out Pinnum  |             Typ          Pinnum

TxD->---(1)------------>T1 IN (11)-------->o-----T1 OUT (14)---------------> Male------(3)
RxD-<---(0)------------<R1 OUT (12)------o<-----R1 In (13)-----------------< Male-----(2)

TxD->---(6)------------>T2 In (10)-------->o------T2 OUT (7)----------------> Female----(2)
RxD-<---(5)------------<R2 Out (9)--------o<-----R2 In (8)-------------------< Female---(3)

GND auf Pin 5 jeweils

ArduFE

Hallo,

ich weiß nicht, ob Du der erste bist, der hier im deutschen Unterforum eine Frage zu diesem Board stellt. Kann aber sein. Abgesehen von den ESP Boards ist das hier recht 8 Bit lastig.

Immerhin habe ich einen MKR Zero und weiß was SERCOM ist. Daher versuche ich zumindest mal den Anfang einer kompetenten Hilfe. Eventuell kann dann noch jemand was ergänzen.

Also, nach dieser Doku Seite, die allerdings Dein Board nicht erwähnt
https://www.arduino.cc/en/Tutorial/SamdSercom
ist SERCOM0 schon für die I2C Schnittstelle in Verwendung. Ob es frei ist, wenn man Wire nicht benutzt oder immer initialisiert wird, kann jetzt nicht sagen. So tief stecke ich in der SAMD21 Arduino Software noch nicht drin.

In der Doku wird das normalerweise unbenutzte SERCOM3 zum Erzeugen von Wire1 benutzt. Also vielleicht mal ein anderes SERCOM und die zugehörigen Pins verwenden. Probiert habe ich das auch noch nicht und auch wahrscheinlich erst nächstes Wochenende Zeit mal wieder einen Arduino anzufassen.

Ich glaube beim Nano IOT ist die SERCOM Zuordnung gleich, weil er den gleichen Arduino Core verwendet. Sicher bin ich aber nicht.

Hoffe schon etwas geholfen zu haben.

janpho

Hallo,


danke für die rasche Antwort.

Die Sercom0 Schnittstelle funktioniert ja einwandfrei! Es ist die gewöhnliche serielle Schnittstelle an Pin 0 und 1 die nicht laufen möchte.

Die Pins zur Sercom 0 findet man in der Variant.cpp zum Nano IoT.
Ich würde als nächstes noch die Sercom1 statt der Normalen Seriellen nutzen... Aber hoffe dass hier jemand doch meinen Fahler findet ;)

janpho

Also,

jetzt habe ich die Stromversorgung geändert, von USB auf V_in. Das hat leider nichts geholfen.
Als nächstes wäre der Wechsel von Standart Serial auf ein zweites Hardware Serial per Sercom...
über den Test_Code gibts nicht?

Danke

janpho

Sorry dass ich jetzt meinen eigenen Post voll-quatsche...

Ich habe das standard serial jetzt durch Sercom1 ersetzt und es funktioniert alles direkt....


Letztendlich weiss ich nicht, woran es liegt. Das Standard Serial über die Board Ausgänge 0 und 1 geht nicht. Ich weiss nicht ob das nun nur bei meinem Board ein problem ist oder gar generell.

Mit freundlichem Gruß,

janpho

Und der Kreis schließt sich.

Für alle die den Nano IoT nutzen wollen:
Serial geht direkt an den USB Ein/Ausgang. Das standard Serial an Txd und Rad erreicht man über: Serial1



Quote
Features

Serial ports on the Arduino NANO 33 IoT

The USB connector of the board is directly connected to the USB host pins of the SAMD21. This routing enables you to use the Arduino NANO 33 IoT as a client USB peripheral (acting as a mouse or a keyboard connected to the computer) or as a USB host device so that devices like a mouse, keyboard, or an Android phone can be connected to the Arduino NANO 33 IoT. This port can also be used as a virtual serial port using the Serial object in the Arduino programming language. The RX0 and TX1 pins are a second serial port available as Serial1.


Go Up