Zum Inhalt springen

Arduino Pinball Controller


Black Knight

Empfohlene Beiträge

Das ist schon komisch. Dann müssen wir da wohl mal etwas nachforschen.

Füge in dein USBcontrol.ino doch mal bitte wie folgt die Serial.print bzw. Serial.println Zeilen ein:

void USB_AttractMode() {                              // Attract Mode
	DispRow1 = DisplayUpper;
	DispRow2 = DisplayLower;
	if (APC_settings[Volume]) {                     		// system set to digital volume control?
		analogWrite(VolumePin,255-APC_settings[Volume]);} // adjust PWM to volume setting
	else {
		digitalWrite(VolumePin,HIGH);}                		// turn off the digital volume control
	for (i=0; i< LampMax+1; i++) {											// turn off all lamps
		Lamp[i] = false;}
	LampPattern = Lamp;
	Switch_Pressed = USB_SwitchHandler;
	Switch_Released = USB_ReleasedSwitches;

	Serial.println("Modus USB ");

	WriteUpper("  USB  CONTROL  ");
	WriteLower("                ");}

Diese Zeile sendet 'Modus USB' sobald er mit der Initialisierung fertig und bereit für USB Kommandos ist.

Dann noch:

void USB_SerialCommand() {
	static byte Command;
	static bool CommandPending;
	static byte SerialBuffer[128];
	static byte BufferPointer;
	byte c = 0;
	byte i = 0;
	if (!CommandPending) {															// any unfinished business?
		Command = Serial.read();}													// if not read new command
	CommandPending = false;
	if (USB_CommandLength[Command] == 255) {
		c = Serial.available();
		i = BufferPointer;
		if (!c) {
			BufferPointer = 0;
			CommandPending = true;
			return;}
		do {
			SerialBuffer[i] = Serial.read();
			i++;}
		while ((SerialBuffer[i-1]) && ((i - BufferPointer) < c));
		if (SerialBuffer[i-1]) {
			CommandPending = true;
			BufferPointer = i;
			return;}
		BufferPointer = 0;}
	else {
		if (Serial.available() >= USB_CommandLength[Command]) {
			for (i=0; i<USB_CommandLength[Command]; i++) {
				SerialBuffer[i] = Serial.read();}}
		else {
			CommandPending = true;
			return;}}

	Serial.print("Command = ");
	Serial.println(Command);

	switch (Command) {																	// execute command if complete

Das gibt den Text 'Command =' und die Nummer des empfangenen Kommandos aus.

Wenn du den geänderten Code hochgeladen hast, dann schließe bitte deine Arduino IDE, verbinde HTerm und drücke am Arduino den Knopf neben den USB Ports (Reset).

Es dauert ein paar Sekunde, dann sollte er sich mit 'Modus USB' melden und wenn du ihm dann eine Null schickst, dann müsste 'Command = 0 APC' kommen (siehe Bild).

 

HTerm2.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 1,6Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

  • Black Knight

    642

  • bontango

    438

  • Volley

    100

  • jabdoa

    97

Top-Benutzer in diesem Thema

Veröffentlichte Bilder

Die Chinaböller haben teilweise andere USB Chips drauf, da gibt es schon mal Treiberprobleme beim verbinden...

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Volley:

da gibt es schon mal Treiberprobleme beim verbinden...

Verbinden und hochladen geht ja, aber dann fangen die Probleme an ...

vor 2 Stunden schrieb Black Knight:

Füge in dein USBcontrol.ino doch mal bitte wie folgt die Serial.print bzw. Serial.println Zeilen ein:

Hab zusätzlich im Setup noch ein hello World reingeschrieben .. Ich sehe auch wie auf dem Arduino die Rx Led kurz an geht wenn ich daten via Hterm schicke, aber keine Reaktion ...

 

 

2019-04-24 14_21_19-Window.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich nehme an, das 'Modus USB' kommt von der Zeile, die du in USBcontrol.ino eingefügt hast. Du bist also offensichtlich im richtigen Modus und kannst vom Arduino empfangen, aber nichts senden.

2 hours ago, Volley said:

Die Chinaböller haben teilweise andere USB Chips drauf, da gibt es schon mal Treiberprobleme beim verbinden...

Was hast du denn für einen Arduino, steht da richtig Arduino DUE drauf oder ist das ein Klon? Das mit den anderen USB-Chips habe ich nämlich auch schon mal gehört. Es könnte ja sein, dass unsere asiatischen Freunde einen anderen USB Controller genommen (oder ihn anders programmiert) haben und nur den Programmiermodus und den seriellen Download implementiert haben - mehr brauchen 95% der Nutzer sowieso nicht.

Unsere Boards sind übrigens angeblich in DE, kann also nicht mehr lange dauern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

1 hour ago, jabdoa said:

Wann wollen wir denn das Bier und Würstchen Event veranstalten (bin jetzt wieder in DE)?

Das nenne ich Timing, denn die Boards sind gerade angekommen und die sehen tatsächlich einwandfrei aus.

Damit ist das Thema Bier und Würstchen wohl aktuell geworden. Wie spontan seid ihr denn, was Termine angeht?

Ich habe diese Woche noch Urlaub und kann daher noch fast alles einrichten, also Do., Fr. und Samstag wäre diese Woche bei mir noch alles drin. Das Wetter lässt in den nächsten Tagen wohl deutlich nach, aber mein Flipperkeller hat einen Terrassenzugang, da kann man sich zur Not hinein verkriechen, wenn's von oben zu dicke kommt.

Also, wie sieht's bei euch aus?

Frank

 

P1020494.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Stunden schrieb Black Knight:

Was hast du denn für einen Arduino, steht da richtig Arduino DUE drauf oder ist das ein Klon? Das mit den anderen USB-Chips habe ich nämlich auch schon mal gehört. Es könnte ja sein, dass unsere asiatischen Freunde einen anderen USB Controller genommen (oder ihn anders programmiert) haben und nur den Programmiermodus und den seriellen Download implementiert haben - mehr brauchen 95% der Nutzer sowieso nicht.

Steht zwar Arduino Due drauf, ist aber nehm ich mal an nicht drin 🙄 bei 10€ inkl. Versand. Kann gut sein dass der Chip nur rudimentär implementiert ist,

werde mir jetzt einen via Reichelt besorgen und berichten ...

uno_clone.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

22 minutes ago, bontango said:

werde mir jetzt einen via Reichelt besorgen und berichten ...

Warte mal ab, bevor du dir noch einen besorgst. Wir sehen uns ja voraussichtlich nächste Woche und dann probieren wir deinen einfach mal aus.

Oder du setzt dich ins Auto und kommst vorbei - heute habe ich noch Urlaub und dann könnten wir gleich auch meinen Raspi in Betrieb nehmen ;)

Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wäre aber schon ein ziemliches Pech; ich habe alle meine DUEs in China gekauft und die funktionieren einwandfrei.

Nicht, dass da doch noch irgendeine blöde PC Einstellung quer schießt.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original Due ist da, leider selbes Verhalten.

Ich habe mal auf die schnelle einen Testprint in USBSerialCommand eingefügt, da scheint er gar nicht hinzukommen,

ansonsten würde ich massiven Output erwarten ... (wird doch gepollt die Routine?)

Noch ne Idee? Ich schau morgen nochmal, bin gleich weg ...

Gruesse

Ralf

 

void USB_SerialCommand() {
    static byte Command;
    static bool CommandPending;
    static byte SerialBuffer[128];
    static byte BufferPointer;
    byte c = 0;
    byte i = 0;

 Serial.print("RTH in USB_SerialCommand");

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist das derselbe Code wie bei dem anderen Arduino? Dann müsstest du doch wenigstens dein 'Hello World' u.s.w. sehen.

Die USB_SerialCommand() Routine wird übrigens nur angesprungen, wenn mindestens 1Byte am Seriell-Anschluss empfangen wurde. Wenn da also nix ankommt, wirst du deinen Text nie sehen.

Ich vermute, dass da irgendwas im PC quer sitzt. Ich benutze die Arduino IDE z.B. selbst nicht mehr - vielleicht blockiert die den Port oder sowas.

Nun bin ich auch kein Experte für digitale Kommunikation, werde mich allerdings am Montag wieder an einem Ort einfinden müssen, an dem es besagte Experten gibt. Ich werde die Jungs einfach mal fragen - zumindest einer von ihnen ist selbst auf der Suche nach einem APC-tauglichen Flipper, da besteht also auch etwas Eigeninteresse. 😉

Noch was: Das Interesse an Bier und Würstchen scheint ja eher begrenzt zu sein. Wenn ihr mir per PM eure Addressen schickt, dann schicke ich euch die Boards natürlich auch zu. Ich dachte nur, man könnte das Angenehme mit dem Nützlichen verbinden. Vielleicht weiß ja auch jemand, wie man sowas am besten verschickt, sonst wird der Versand teurer als die Boards.

Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Black Knight:

Noch was: Das Interesse an Bier und Würstchen scheint ja eher begrenzt zu sein. Wenn ihr mir per PM eure Addressen schickt, dann schicke ich euch die Boards natürlich auch zu. Ich dachte nur, man könnte das Angenehme mit dem Nützlichen verbinden. Vielleicht weiß ja auch jemand, wie man sowas am besten verschickt, sonst wird der Versand teurer als die Boards. 

Nächste Woche würde bei mir passen. Habe Mittwoch bis Sonntag bisher nicht verplant aber frei. Wann würde es dir passen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich benutze ein Arduino Plugin für Eclipse. Da muss man den seriellen Monitor gezielt ein- bzw. ausschalten. Allerdings bschwert sich das HTerm bei mir sofort, falls ich den Monitor angelassen habe. Außerdem hatte ich den Ralf ja gebeten, die IDE vor der Kommunikation mal zu beenden, um zu sehen ob das Ding irgendwie stört. Das hat aber alles nicht geholfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

void USB_SerialCommand() {
    static byte Command;
    static bool CommandPending;
    static byte SerialBuffer[128];
    static byte BufferPointer;
    byte c = 0;
    byte i = 0;

 Serial.print("RTH in USB_SerialCommand");

Das ist dein komplettes Programm?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, das ist nur der Anfang einer Routine, in die der Ralf einen Print Befehl eingesetzt hat, um zu sehen ob das Programm da hin läuft.

Mein Quellcode besteht aus den *.ino Files und dem Sound.h, die in meinem GitHub Projekt stehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habs gefunden, nur warum es bei Dir geht und bei mir nicht bin ich nicht 100% sicher.

 

In der USBcontrol nahe Zeile 91 habe ich folgendes eingefügt (in fett):

void USB_Testmode(byte Dummy) {                                                // enter system settings if advance button still pressed
    UNUSED(Dummy);
    if (Switch[72]) {
        SerialCommand = 0;
    Serial.println("RTH Serialcommand set to 0");
        Settings_Enter();}
    else {
        byte i = 0;

Da läuft er nach ein paar Sekunden nach dem Start rein, und setzt SerialCommand auf Null.

Das erklärt warum er nicht den seriellen Port abfragt (oder nur kurz)

Nachdem ich dann in der APC die Switchmatrix habe initialisieren lassen (nahe Zeile 310)

void Init_System() {
//RTH init Switchmatrix
for(i=0;i<SwMax+3;i++) Switch = 0;

 
    if (SDfound) {                                                                            // SD card found?
        File Settings = SD.open(APC_set_file_name);                // look for system settings
        if (!Settings) {

läuft das Programm jetzt!

Könnte es sein dass dein Plugin die Variablen automatisch (auf Null) initialisiert, die Arduino IDE aber nicht?

Der gcc im Linux macht das mit der Initialisierung auch nicht immer sauber, da hab ich auch schon öfters gesucht und die Ursache

war dann ein fehlender Init ... daher bin ich da immer übervorsichtig und verlasse mich nicht auf den Compiler.

 

Das war mir auch an anderen Stellen aufgefallen, dass dein Programm darauf vertraut dass die Initialwerte gesetzt sind.

z.B. USBControl am Anfang der Routine USB_SerialCommand() ( nahe Zeile 99)

-> static bool CommandPending;

da würde ich auch schreiben:

-> static bool CommandPending = 1; ( oder in dem Fall =0, bin mir nicht sicher was der Anfangswert ist?)

Weils ja direkt am Anfang

if (!CommandPending) {                                                            // any unfinished business?

die Variable abgefragt wird, und beim allerersten Call noch keinen zugewiesenen Wert hat.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe am Anfang auch immer alle Variablen initialisiert, dann habe ich aber irgendwo gelesen, dass automatisch immer mit 0 initialisiert wird und bin etwas schlampiger geworden.

Eigentlich kann das bei dir aber auch nicht der Grund sein, denn es gibt diese Initialisierung sogar noch. Irgendwo ziemlich weit oben im Setup (Zeile 273) steht:

	for (i=1; i< SwMax+1; i++) {
		Switch[i] = false;
		SwHistory[i] = 0; }                               // initialize switch status

Die Schalter wurden also initialisiert und du machst das jetzt später nochmal und löschst damit einen zwischenzeitlich erkannten Schalter.

Ich nehme an es liegt daran, dass du keine Hardware dran hast und deine Switch-Input Leitungen daher floaten. Dann ist es reiner Zufall, ob sich da ein Pegel über oder unter der High-Schwelle einstellt und ob der Switch daher als gesetzt gewertet wird oder eben nicht.

Was mich an dieser Theorie stört ist, dass der Controller während des Reset Zyklus an alle Ports einen Pullup-Widerstand zuschaltet, betätigte Schalter die Leitung aber runter ziehen. Daher sollten die Schalterstränge am Anfang nach dem Reset als inaktiv gewertet werden und eher auf lange Sicht aktiv werden können, falls sich die Leitungen langsam entladen. Bei dir ist es aber genau umgekehrt, das Ding wird am Anfang einmal erkannt und danach nicht mehr. Außerdem habe ich ja auch einmal einen Arduino ohne HW probiert und der hat auch geklappt.

Hast du irgendwelche Kabel o.ä in der Nähe des Arduinos liegen, die während oder kurz nach dem Reset in die Schalterpins einkoppeln könnten?

Ist aber auch egal, ich bin mir ziemlich sicher, dass diese Probleme mit angeschlossenem APC verschwinden werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, da machst Du den Init auch, merkwürdig. Der Arduino liegt einsam auf meienm Schreibtisch, da ist nur der PC.

Der einzige Unterschied zu deinem Test ohne HW wäre der Compiler oder?

Aber schauen wir mal, ich kann jetzt erst mal weiter testen und bring Dir Samstag eine erste LISY-Mini Version auf SD mit.

Bis denn ..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was für einen Compiler nimmt die Arduino IDE denn unter Windows? Mein Plugin nimmt den GCC.

Vielleicht hat es aber auch tatsächlich eine HW Änderung auf den Arduinos gegeben oder im Bootloader. Wenn der das Timing nach dem Reset ändert kann da auch was anderes rauskommen.

Bring die Arduinos am Samstag mal mit, dann können wir ja mal herumprobieren.

Frank

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, gcc, aber die Windows Version, bzw. genauer: \\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-gcc

Auch da habe ich schon böse Erfahrungen mit gemacht. System1 (LISY1) war unter Linux nicht lauffähig, unter Windows lief es.

Es lag an einem Statement welches der Linux gcc anders (falsch) als der auf Windows interpretierte.

Das Aufteilen des Statements auf zwei brachte dann die Lösung.

Da habe ich drei Wochen lang zusammen mit den pinmame developern dran rumgedoktort ..aber das ist ne andere Geschichte .. 🙄

 

Das Verhalten ist aber reproduzierbar, ohne die Initsequenz läuft er nie, mit immer.

Habe die Version mit der es nicht läuft mal exportiert und auf meine Dropbox gelegt:

https://www.dropbox.com/s/md3pcvrpypqu49f/APC.ino.bin?dl=0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Boah, da müsste ich mich jetzt erst mal schlau machen, wie ich das Zeug ohne zu compilieren direkt an den Arduino schicke - ich fürchte, dazu reicht meine Energie heute nicht mehr aus.

Mir ist übrigens noch ein Problem unserer API aufgefallen:

Wir hatten gesagt, dass wir den Inhalt der Displays als BCD plus Komma in Bit 7 übertragen - das geht aber nur für rein numerische Displays auf BCD Basis. Bei Sys11 Geräten funktioniert das nicht mehr und wir müssen ASCII oder Segmentmuster übertragen. Das Ganze wird dann zum Problem, wenn Leute ihren Flipper mit anderen Display betreiben wollen, als ursprünglich vorgesehen (z.B. einen Comet mit Alphas). Wenn man dieses Gerät jetzt mit PinMame betreiben möchte, dann würde der immer BCD Daten senden. Beim APC wird aber nur der verwendete Displaytyp eingestellt, er weiß also nicht welches Spiel im PinMame läuft und damit auch nicht welche Displays dazu normalerweise gehören.

Wir müssten also entweder ein gemeinsames Datenformat für alle Displays einführen oder man müsste beim APC einstellen, was da an Displaydaten kommt, damit er sie entsprechend konvertieren kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

×
×
  • Neu erstellen...

Wichtige Information

Datenschutzerklärung und Registrierungsbedingungen