Arduino Uno + USB Host Shield | Nach USB Eingang PINs auf Low oder High setzen

Hallo liebe Leute,

kurz vorab mein Vorhaben, welches sich eigentlich recht simpel anhört :smiley: :

Es soll bei einem Dateninput über USB ein PIN zwischen Low und High wechseln.

Hierzu habe ich ein Beispiel aus der offizielen USB Host Shield Library 2.0 genommen und entsprechend angepasst,

#include <hidboot.h>
#include <usbhub.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

// EIGENES ZEUG !!!!!!
int TEEST = 0;
// EIGENES ZEUG !!!!!!


class KbdRptParser : public KeyboardReportParser
{
  protected:
    void OnKeyDown  (uint8_t mod, uint8_t key);
};


void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{ 
 // EIGENES ZEUG !!!!!!
  if (TEEST == 1)
  {
    TEEST = 0;
  }
  else
  {
    TEEST = 1;  

  }
// EIGENES ZEUG !!!!!!
}


USB     Usb;
//USBHub     Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);

KbdRptParser Prs;

void setup()
{
// EIGENES ZEUG !!!!!!

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(11, OUTPUT);
// EIGENES ZEUG !!!!!!

  
   Serial.begin( 115200 );
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  Serial.println("Start");

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

  delay( 200 );

  HidKeyboard.SetReportParser(0, &Prs);

}

void loop()
{

  Usb.Task(); 

// EIGENES ZEUG !!!!!! 
  if (TEEST == 1)
  {

    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    digitalWrite(11, HIGH);
    Serial.println("Set on High");
  }
  else
  {
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(11, LOW);
    Serial.println("Set on Low");
  } 
// EIGENES ZEUG !!!!!!
  
}

Wenn man das Programm nun ausführt, wechseln die Strings "Set on Low" oder "Set on High" nach USB Eingang auch.

Die Funktion digitalWrite wird jedoch nicht ausgeführt, da die eingesteckte LED nicht ausgeht und weiterhin leuchtet.

Nach eingen Probieren habe ich auch den Verursacher gefunden. Und zwar die folgende Codezeile:

if (Usb.Init() == -1)

Diese Zeile kann ich jedoch nicht weglassen, da sonst der USB Eingang nicht mehr registriert wird.

Hat jemand von Euch eine Idee, wie ich trotzdem die PINs zwischen Low und High schalten kann?

Vielen Dank im Voraus.

Kommt "OSC did not start"?

Kann es sein, daß der LED Pin vom USBShield/Bibliothek benutzt wird?
Wie ist die LED angeschlossen?
Was macht die eingebaute LED?

Dein Sketch ist totaler Mist....leider steigt man da nicht durch.

Du verwendest einen Uno und bindest Libraries ein die wir nicht kennen.
Ohne einen Link darauf, können wir kaum helfen.

Und was soll das heißen: "// EIGENES ZEUG !!!!!!" ?

Der Sketch sieht gut aus, bis auf die Bibliotheken und die Beschreibung, was beim Start alles ausgegeben wird.

Dies hier ist der Link zu der Library:

Hierbei das Beispiel HID -> USBBootHIDKbd

Jeglicher Code der in "// EIGENES ZEUG !!!!!!" eingefasst ist, ist Code, den ich dem Beispiel hinzugefügt habe.

"OSC did not start" wird nicht angezeigt.

Die LED hab ich mit - in GND und + in Pin 11 gesteckt

Die eingebaute LED leuchtet gar nicht. Diese leuchtet nur, wenn man besagte Codezeile "if (Usb.Init() == -1)" weglässt und in dem void loop per digitalwrite die builtin LED direkt ohne if abfrage auf high setzt.

Ob der LED PIN von der Bibliothek genutzt wird, kann ich ehrlich gesagt nicht sagen...

Hi,
hast du bitte noch nen link zu deinem USB Host Schield, damit auch wir sehen können, welche anschlüsse das Hostschield vom Uno belegt und benutzt.
so können wir leichter helfen.

Also wenn ich mich nicht verlesen habe nutzt die USBHOST.h die SPI pins des UNO.

Auf pin 13 (Builtin-Led) liegt SPI pin SCK
Auf pin 12 liegt SPI pin MISO
Auf pin 11 (deine LED) liegt SPI pin MOSI , damit wird dieser von der SPI gestuert. digitalWrite geht da nicht, wenn SPI in gebrauch.
Auf pin 10 liegt SPIpin SS

Du musst also für deine LED nen anderen Pin , also keinen der SPI-Pins, oder so verwenden z.B pin 9. Dann dürfte es funktionieren.

Vielen Dank für die zahlreichen Hilfestellungen !

Dies hier ist der Link zum USB Host Shield
https://www.amazon.de/ARCELI-Shield-Arduino-Unterstützung-Android/dp/B07J2KKGZ4/ref=pd_lpo_sbs_147_t_0?_encoding=UTF8&psc=1&refRID=FC88TRNBN5RQD30P8D3S

@ Deltaflyer

KLASSE!! Es hat geklappt !!! Vielen Dank !!!!

Lag wirklich daran, dass das USB Host Shield besagte PINs genutzt hat. !!

Vielen vielen Dank !

Gern geschehen. Habe ehrlich gesagt, die lib erst runtergeladen und angeschaut, NACHDEM ich nach dem Link zum Schield gefragt habe.
Da sah ich dann, dass diese die SPI benutzt.
Gut , das hätte mir eigentlich schon auffallen müssen, wegen dem #include <SPI.h>

Wieso benutzt Du denn ein USB-HOST Shield? Funktioniert der USB SLAVE des Arduino für diesen Zweck nicht auch?
Grüße Uwe

Hi

SPI und Nutzung der SPI-Pins hatte ich ja auch schon Mal - bei mir wurde nur die Freigabe des Pin (13) gefordert, um einen Error-Code vor-blinken zu können (geht nämlich auch nicht, wenn die SPI-Hardware Da die Finger drauf hat).
Da reicht ein SPI.end(); - bei mir war keine Reaktivierung danach nötig (also kA, wie Das dann geht), hier griff dann der WatchDog für ein sauberen Reset des Arduino.
(bei mir wurde ein CAN-Modul per SPI eingebunden - wenn Das nicht klappte oder im Programmlauf nicht mehr klappte, sollte der Arduino neu starten).

Karma für Delta für die Auflistung der anderen ebenfalls betroffenen SPI-Pins

MfG

Dankeschön @postmaster-ino für das Karma.

LG Stefan