Bar Code Scanner, SPI protocol

Hallo,

ich versuche einen Bar Code auszulesen mit einem Arduino Uno+USB Shield+LCD Display. Ich habe das SPI Protokol Programm kopiert. Das Uno Board lässt keine USB librarys zu, ansonsten hätte ich damit gearbeitet.

Das Problem ist, dass der angezeigte Bar code nur wenige Zahlen anzeigt und die meisten übersprungen werden. (immer die gleichen Zahlen bei gleichem Bar Code)

Woran könnte das liegen und weswegen habe ich diese Fehlermeldungen?
Müsste ich nicht auch irgendwo die SPI Kommunikation einstellen, wie z.B. serial Clock, communication Pin,..

Danke im voraus :slight_smile:

#include <usbhid.h>
#include <usbhub.h>
#include <hiduniversal.h>
#include <hidboot.h>
#include <SPI.h>

class MyParser : public HIDReportParser {
  public:
    MyParser();
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
  protected:
    uint8_t KeyToAscii(bool upper, uint8_t mod, uint8_t key);
    virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
    virtual void OnScanFinished();
};

MyParser::MyParser() {}

void MyParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
  // If error or empty, return
  if (buf[2] == 1 || buf[2] == 0) return;

  for (uint8_t i = 7; i >= 2; i--) {
    // If empty, skip
    if (buf[i] == 0) continue;

    // If enter signal emitted, scan finished
    if (buf[i] == UHS_HID_BOOT_KEY_ENTER) {
      OnScanFinished();
    }

    // If not, continue normally
    else {
      // If bit position not in 2, it's uppercase words
      OnKeyScanned(i > 2, buf, buf[i]);
    }

    return;
  }
}

uint8_t MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
  // Letters
  if (VALUE_WITHIN(key, 0x04, 0x1d)) {
    if (upper) return (key - 4 + 'A');
    else return (key - 4 + 'a');
  }

  // Numbers
  else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
    return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
  }

  return 0;
}

void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
  uint8_t ascii = KeyToAscii(upper, mod, key);
  Serial.print((char)ascii);
}

void MyParser::OnScanFinished() {
  Serial.println(" - Finished");
}

USB          Usb;
USBHub       Hub(&Usb);
HIDUniversal Hid(&Usb);
MyParser     Parser;

void setup() {
  Serial.begin( 115200 );
  Serial.println("Start");

  if (Usb.Init() == -1) {
    Serial.println("OSC did not start.");
  }

  delay( 200 );

  Hid.SetReportParser(0, &Parser);
}

void loop() {
  Usb.Task();
}
C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino: In member function 'virtual void MyParser::Parse(USBHID*, bool, uint8_t, uint8_t*)':

C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino:35:38: warning: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]

       OnKeyScanned(i > 2, buf, buf[i]);

                                      ^

C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino:13:18: note: initializing argument 2 of 'virtual void MyParser::OnKeyScanned(bool, uint8_t, uint8_t)'

     virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);

                  ^

https://forum.arduino.cc/index.php?topic=542337.0

Zu was brauchst Du das USB Shield?
Grüße Uwe

Vielleicht für den Barcode-Scanner?

@Clockben:
Welchen Barcode-Scanner verwendest du?
Bitte einen Link.

Wie ist dieser angeschlossen?

Was soll deine Hardware und Software machen?

Hi ,

ich kenne jetzt das USB Shield nicht, ich könnte mir aber vorstellen das es mit einer Soft-Serial an der Uno Seite arbeitet und die Geschwindigkeit zu hoch ist. Damit gehen dann Zeichen verloren.

Gruß Heinz

Soft-Serial eher nicht.

Es gibt ja verschiedene "USB-Shields".
Das Shield im Link des TO verwendet jedenfalls SPI zur Kommunikation mit dem Arduino.

Ich kenne dann noch:
Original-Arduino-USB-Host-Shield
USB-Host-Shield von SparkFun
Auch diese verwenden SPI.

uxomm:
Vielleicht für den Barcode-Scanner?

Da würde ich doch einen Barcoderscanner mit PS2 Anschluß nehmen; der ist ohne Shield auszuwerten. Vieleicht kann man den vorhandenen sogar umschalten auf PS2.
Grüße Uwe

Danke für eure Antworten,

ich habe diesen Barcode Scanner
und den originalen USB Host Shield v2.0 um den Scanner anzuschließen.

Dieser ist dann einfach auf das Uno Board draufgesteckt.

Wie könnte ich denn die Geschwindigkeit der Kommunikation ändern?
Sollte da eine Baudrate (oder Serial Clock vom SPI Protokoll) zwischen Uno <> USB Shield und zwischen USB Shield <> Scanner eingestellt werden?

Die USB-Verbindung müßte der Hostcontroller auf dem USB-Shield automatisch machen.
Die SPI besitzt keine Bautrate sondern eine Clockfrequenz. Ein Barcodereader müßte sich über USB wie eine Tastatur verhalten. Schau mal ob Du Beispiele für das Einlesen einer USB-Tastatur findest.
Grüße Uwe

uwefed:
Die SPI besitzt keine Bautrate sondern eine Clockfrequenz. Ein Barcodereader müßte sich über USB wie eine Tastatur verhalten. Schau mal ob Du Beispiele für das Einlesen einer USB-Tastatur findest.
Grüße Uwe

Ja deswegen frage ich ja wie man die Clockfrequenz des SPI Protocol einstellen kann?

Wie gesagt:
Das Uno Board lässt keine USB librarys zu, ansonsten hätte ich damit gearbeitet.

Ja deswegen frage ich ja wie man die Clockfrequenz des SPI Protocol einstellen kann?

Die Arduino Doku sagt:

Use SPISettings with SPI.beginTransaction() to configure SPI parameters.