Arduino Nano Ausgabe produziert nur komische Zeichen

Hallo,

ich möchte ein DIY-Motor-Focuser Projekt mit Arduino Uno verwirklichen und eigentlich klappt das auch ganz gut. Der Motor-Focus lässt sich über ASCOM steuern. Wenn ich den Motor-Focus aber an meinen Odroid N2+ anschliesse, auf dem Ubuntu 22.04 läuft, funktioniert nichts.

Also habe ich testweise mal den SerialPortResponse Sketch probiert. Auf meinem Windows-PC funktioniert der super, aber auf dem Odroid N2+ nicht. Die Ausgabe enthält nur komische Zeichen. Die Baudrate im seriellen Monitor in der Arduino IDE ist gleich mit der Baudrate im Sketch. Wenn ich andere Baudraten im seriellen Monitor wähle, wird es auch nicht besser.

odroid@odroid:~$ stty -a -F /dev/ttyUSB1
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 0; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke -flusho -extproc

odroid@odroid:~$ ls -l /dev/ttyUSB1
crw-rw-rw-+ 1 root dialout 188, 1 Dec 21 10:10 /dev/ttyUSB1

odroid@odroid:~$ lsusb
Bus 002 Device 002: ID 05e3:0620 Genesys Logic, Inc. USB3.1 Hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Bus 001 Device 007: ID 0547:129e Anchor Chips, Inc. USB2.0 Camera
Bus 001 Device 006: ID 2357:0108 TP-Link TL-WN822N Version 4 RTL8192EU
Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Nach Stunden des Probierens bin ich mit meinem Latein am Ende und weiß nicht mehr weiter...
Vielleicht kann mir jemand helfen und mir einen Tipp geben, was ich noch versuchen könnte?

Hallo,

mal ganz doof gefragt, ist das auch der richtige Port der ausgewählt ist?

Hi und danke für deine Antwort. Der Port ist korrekt. Wenn ich den Arduino abstecke, kommt nichts mehr an und wenn ich das Delay im Sketch anpasse, verzögert sich auch die Ausgabe dementsprechend. Dmesg sagt auch, dass der Arduino auf ttyUSB1 verbunden ist.

Zeichesatz Probleme?

Kannst Du uns den kompletten Sketch mal in lesbarer Form (also als Text in Codetags) hier einstellen? Wie das geht, steht hier.

Gruß Tommy

Hier ist der Code:

int firstSensor = 0;   // first analog sensor
int secondSensor = 0;  // second analog sensor
int thirdSensor = 0;   // digital sensor
int inByte = 0;        // incoming serial byte

void setup() {
  // start serial port at 9600 bps:
  Serial.begin(9600);
  while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(2, INPUT);   // digital sensor is on digital pin 2
  establishContact();  // send a byte to establish contact until receiver responds
}

void loop() {
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    // read first analog input, divide by 4 to make the range 0-255:
    firstSensor = analogRead(A0) / 4;
    // delay 10ms to let the ADC recover:
    delay(10);
    // read second analog input, divide by 4 to make the range 0-255:
    secondSensor = analogRead(1) / 4;
    // read switch, map it to 0 or 255L
    thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
    // send sensor values:
    Serial.write(firstSensor);
    Serial.write(secondSensor);
    Serial.write(thirdSensor);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print("Welcome");  // send a capital A
    delay(3000);
  }
}

Viele Grüße

Dein Sketch schreibt bei mir alle 3 Sekunden Welcome ...
( System: OpenSuse Tumbleweed )

Auch wenn der Sketch hier läuft, diese Zeilen

while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }

sieht unnütz aus, - geht ohne genauso... :wink:

Ich frag noch mal: Welchen Zeichensatz hast Du auf dem Odroid?

Danke für deine Antwort. Der Sketch wird mit der Arduino IDE mitgeliefert. Bei mir auf den beiden Windows PC's wird auch "Welcome" alle 3 Sekunden ausgeliefert. Leider bekomme ich auf dem Odroid N2+ nur diese komischen Zeichen alle 3 Sekunden.

Ich hatte deine Frage leider übersehen, sorry.

locale gibt folgendes aus:

odroid@odroid:~$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

Ich hoffe, diese Info hilft.

das sieht stark nach chinesischer lokalisierung aus...

bei mir ist das so:

LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

Und: als root arbeitet man eigentlich auch nicht... ;-))

Ich habe leider nicht sehr viel Erfahrung mit Linux. Ich nutze das Ganze nur für mein Teleskop. Aber du hast natürlich recht.

Ich habe jetzt mal alles auf Deutsch umgestellt und locale gibt jetzt das gleiche aus wie bei dir. Leider ändert sich dadurch die Ausgabe in die Arduino IDE nicht. Mit CuteCom das gleiche.

Ich wollte mir vor ein paar Tagen eigentlich einen originalen Arduino Nano bestellen, habe aber fälschlicherweise einen Nano Every bestellt. Mit diesem funktioniert der Sketch wunderbar. Leider schaffe ich es mit diesem aber nicht, den Focuser-Code (GitHub - fehlfarbe/arduino-motorfocus: Arduino motorfocus with moonlite protocol for telescopes) zum laufen zu bekommen und anzupassen.

Auch nicht nach einem Neustart ? Dann habe ich erst mal keine Idee mehr woran das liegen könnte...

Hallo,

der Every ist zwar nicht schlecht, ich selbst finde ich den richtig gut, aber das allgemeine Problem ist es wird ein Exot unter den Arduinos bleiben wie der Due und andere. Der Focus Sketch benötigt ja noch andere Libs.

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimerOne.h>
#include "DummySerial.h"

Davon ist mindestens die TimerOne nicht für den Every angepasst. Du kommst schneller zum Ziel wenn du dir einen Nano mit ATmega328P kaufst. Ist leider so.

Wegen den falschen seriellen Zeichen. Wenn das hier Gesagte alles nicht hilft, würde ich vielleicht im Odroid Forum nachfragen.

Der folgende Sketch soll eigentlich das Gleiche machen.
Einfach mal probieren.
Wenns nicht geht, stell mal die Geschwindigkeit auf 115200 (sowohl im Code als auch im SerMon)

uint16_t firstSensor = 0;   // first analog sensor
uint16_t secondSensor = 0;  // second analog sensor
uint16_t thirdSensor = 0;   // digital sensor

const byte digitalInputPin = 2;
const byte analogInputPins[2] = {A0, A1};

uint32_t lastTime = 0;
const uint32_t intervall = 3000;


void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(digitalInputPin, INPUT);   // digital sensor is on digital pin 2
  establishContact();  // send a byte to establish contact until receiver responds
  while (Serial.available() > 0)
  {
    Serial.read();
  }
  Serial.println(F("Los gehts..."));
}

void loop()
{
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0)
  {
    firstSensor = analogRead(analogInputPins[0]) / 4;
    Serial.write(firstSensor);
    // delay 10ms to let the ADC recover:
    delay(10);
    // read second analog input, divide by 4 to make the range 0-255:
    secondSensor = analogRead(analogInputPins[1]) / 4;
    Serial.write(secondSensor);
    // read switch, map it to 0 or 255L
    digitalRead(digitalInputPin) == 0 ? thirdSensor = 0 : thirdSensor = 255;
    // send sensor values:
    Serial.write(thirdSensor);
    Serial.println(F("Alles ausgegeben"));
  }
  else if (millis() - lastTime > intervall)
  {
    establishContact();
  }
}


void establishContact()
{
  Serial.print(F("TIK"));  // send a capital A
  lastTime = millis();
}

PS: Deine Kommentare wollen etwas, was nicht geht.
255*4 ergibt 1020. Wenn der Wert bei 1023 liegt, bekommst Du 256 raus.
Und das map habe ich nicht verstanden - es ist die Funktion die am langsamsten ist... Darum mal geändert.

Hallo und vielen Dank für eure Antworten. Leider hat nichts zum Erfolg geführt, so dass ich mir nochmal einen originalen Nano gekauft habe. Mit diesem funktioniert es nun einwandfrei. Ich denke mal, dass es am anderen seriellen Konverter(?) lag. Vielleicht auch ein Treiber-Problem.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.