Go Down

Topic: 6 Taster sollen Buchstaben a bis f ausgeben und WS2812B 1 bis 6 den Status  (Read 2522 times) previous topic - next topic

mc-big-d

klappt bei dir schon die Verbindung mit dem Tutorial von http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-can-bus-module-1st-network-tutorial/ ?

Hast du dann schon einen zweiten Sender aufgebaut? klappt das auch schon?

Das RX/TX zusammenfügen scheint mir nicht das große Problem zu sein (zumindest kompiliert das ganze), ich im Urlaub und habe hier aktuell keine 3 freien Unos rumliegen.
Nein, ich habe noch keine Bauteile gekauft, weil ich erstmal die Codes verstehen und so gut wie möglich erstellen will. Wenn ich aus dem aktuellen Umzugsstress raus bin und meinen Bastelplatz fertig habe, werde ich aber die Sachen kaufen und den Sketch dann drauf schmeisen. Bis dahin will ich alles soweit wie möglich haben und bin auf das Code schreiben beschränkt. Schaltungen von Tastern usw (im kleinen) lasse ich von einem Kumpel nachbauen und testen.

agmue

F13 bis F 24 sind Erweiterungen der Tastatur, ... und meist nicht unter Verwendung sind.
Wie testest Du, wenn sie keine Verwendung haben?
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

mc-big-d

Wie testest Du, wenn sie keine Verwendung haben?

Mit der Logitech Software, da sieht man welche Taste ausgegeben wird. Auch F13 bis F24!

Andii1980

Wie testest Du, wenn sie keine Verwendung haben?

so hier testen wir es immer ;)
und bevor jetzt die Antwort kommt das wir es ja hinbekommen haben und es geht.
Nein es geht nicht so wie mc-big-d es haben möchte ;)

Das hier ist mit einem anderen Sketch wo nur die Keyboard.h eingebunden ist und es dann reicht wenn ich bei mir KEY_F13 - KEY_F24 eingebe. Was so leider nicht klappt bei ihm.





noiasca

Nein, ich habe noch keine Bauteile gekauft, weil ich erstmal die Codes verstehen und so gut wie möglich erstellen will. Wenn ich aus dem aktuellen Umzugsstress raus bin und meinen Bastelplatz fertig habe, werde ich aber die Sachen kaufen und den Sketch dann drauf schmeisen. Bis dahin will ich alles soweit wie möglich haben und bin auf das Code schreiben beschränkt. Schaltungen von Tastern usw (im kleinen) lasse ich von einem Kumpel nachbauen und testen.
Dann wird es Zeit dass du endlich aus dem Forum-Schreiben rauskommst und anfangst zu MACHEN.

Ich kann dich nur warnen: wenn du dir die Codebeispiele ansiehst denkst dir zunächst - ist ja übersichtlich und "einfach". Dann steckst du das erste mal die Hardware zusammen und fällst von einem Schlagloch ins andere. Ein kompilierbares Programm ist das eine, eine funktionierende Kommunikation zwischen zwei Module das andere.

Die (bidirektionale) Verbindung zwischen dem UNO und einem Nano hat mich jetzt über 3 Stunden gekostet und ich dachte bisher, dass ich zumindest schon ein wenig Erfahrung mitbringe. Wie du das ohne Hardware lösen willst, stell ich mir zumindest "herausfordernd" vor.




DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

mc-big-d

Es sind 15 Module komplett getestet und funktional im Standalone-Betrieb aufgebaut worden. Bis auf die "F13" bzw Buchstabenausgabeprobleme ist alles funktional.


Nun wäre halt ein Beispiel Sketch mit 3 oder mehr birektional laufenden Arduinos echt mega, sodass ich anhand dessen das ganze verstehen kann und ein Beispiel habe, mit dem ich das umsetzen kann.


postmaster-ino

Hi

Sieh Dir die Beispiele einer nehezu beliebigen CAN-Bibliothek an.
Jeder der Drei bekommt eine eigene ID und funkt nach zufälliger Wartezeit (per millis - delay ist böse, da wir ja noch was Anderes, als Warten, wollen) eine aufsteigende Zahl.
Jeder Knoten empfängt Diese und printet Die per Terminal.
Das Empfangen geht 'nebenher' - im Grunde warten die drei Knoten nur die ganze Zeit, daß
- entweder die Wartezeit vorbei ist
- man Jemanden empfängt, um Dessen Nachricht auszugeben

Eigentlich kein Hexenwerk und lässt sich mit den Beispielen 'send' und 'receive', Beide zu einer Einheit kombiniert, erschlagen.

Erfreulich, daß schon Module aufgebaut und getestet wurden!!

Wie Du eine dem System unbekannte Taste (F13) ans System senden und dort erkennen willst - gute Frage!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Andii1980

@postmaster-ino: Die Tasten F13-F24 sind Tasten die von Windows selbst schon vorgegeben sind. Siehe mein Letzes Posting auf dem Bild. dort habe ich es bei mir selbst ja drin.

Ich habe die Tasten Dank dem Hexenwerk Google gesehen ;)

agmue

Mit der Logitech Software, da sieht man welche Taste ausgegeben wird. Auch F13 bis F24!
Die habe ich nicht installiert, da ich keine Logitech Tastatur nutze.

Aber F1 funktioniert bei meinem Editor, getestet mit Teensy 3.2. Möglicherweise verwendest Du die falsche Methode.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

noiasca

@CAN: Also spätestens beim dritten Board wird man es leid, den Sketch zu individualisieren. Ergo habe ich begonnen zunächst eine Board-ID ins EEPROM auf Adresse 1 zu flaschen und dann erst den Sketch aufzubringen.


SCHRITTE
 erledigt sind:
 - mit send-Sketch an receive-Sketch Daten senden
 - send und receive in einem sketch
 - zentrale Verwaltung der einzelnen Boards
 - unterschiedliche Messages für unterschiedliche Prioritäten
 - periodischen Heartbeat senden
 - Buttons auslesen
 offene Punkte sind (mindestens):
 - eingehenden Daten interpretieren und RGB Led setzen
 - eingehenden Daten maskieren und filtern
 - Ausgabe/Monitor der CAN Daten nur wenn eine Option beim Board gesetzt ist
 - alles rund um failsafe
 - eine Portierung für den MASTER

Code: [Select]

// combined CAN RX and TX
// noiasca
// based on Henry's Bench http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-can-bus-module-1st-network-tutorial/
// SCHRITTE / TODOs
// erledigt sind:
// - mit send-Sketch an receive-Sketch Daten senden
// - send und receive in einem sketch
// - zentrale Verwaltung der einzelnen Boards
// - unterschiedliche Messages für unterschiedliche Prioritäten
// - periodischen Heartbeat senden
// - Buttons auslesen
// offene Punkte sind (mindestens):
// - eingehenden Daten interpretieren und RGB Led setzen
// - eingehenden Daten maskieren und filtern
// - Ausgabe/Monitor der CAN Daten nur wenn eine Option beim Board gesetzt ist
// - alles rund um failsafe
// - einen Master bauen

#include <SPI.h>
#include "mcp_can.h"
#include <EEPROM.h>

const byte sketchVersion = 1;          // The version of this sketch
#define TXT_BOARDNAME "CAN RX and TX"  // The Sketch name

const byte addrBoardId = 1;          // EEPROM Adress where the board ID should be stored
byte USE_BOARD = 0;

// Basis 11 bit max 2047
// extended 29 bit max 536870911
long unsigned int txID = 0; // This format is typical of a 29 bit identifier.. the most significant digit is never greater than one.

enum priorities {BUTTON,    // Changes of inputs like Buttons, Switches have the highest priority
                 RGB,       // LEDs which needs to be changed have a medium priority
                 HEARTBEAT  // Heartbeats are sent on a regular with lowest priority
                };
priorities prio = HEARTBEAT;
uint16_t sendInterval = 5000;

const int SPI_CS_PIN = 10;

// Build an ID or PGN
unsigned char stmp[8] = {0x0E, 0x00, 0xFF, 0x22, 0xE9, 0xFA, 0xDD, 0x51};
uint32_t sendPrevious = 0;

//receive
long unsigned int rxId;
unsigned long rcvTime;
unsigned char len = 0;
unsigned char buf[8];

//Construct a MCP_CAN Object and set Chip Select
MCP_CAN CAN(SPI_CS_PIN);

const byte buttonPins[] = {3, 4, 5, 6, 7, 8}; // PIN Definition of the buttons
const byte ANZAHL = sizeof(buttonPins);
byte previousPort = 0;                        // previous state of the ports

void setup()
{
  for (byte j = 0; j < ANZAHL; j++) {
    pinMode(buttonPins[j], INPUT_PULLUP);
  }
  Serial.begin(115200);
  Serial.println(F(TXT_BOARDNAME));
  USE_BOARD = EEPROM.read(addrBoardId);               // get the board ID from EEPROM
  switch (USE_BOARD)
  {
    case 1:
      // hier die vom Standard abweichenden Definitionen
      sendInterval = 1000;
      break;
    case 2:
      sendInterval = 2000;
      break;
    case 3:
      sendInterval = 3000;
      break;
    case 0xFF:
      Serial.println(F("ID not set in EEPROM (0xFF). New module?"));
      break;
    case 0:
      Serial.println(F("ID not set in EEPROM (0x00). EEPROM deleted?"));
      break;
    default:
      Serial.println(F("ID unknown - Stopp"));
      break;
  }
  Serial.print(F("USE_BOARD=")); Serial.println(USE_BOARD);
  while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus
  {
    Serial.println(F("CAN BUS Module Failed to Initialized"));
    Serial.println(F("Retrying...."));
    delay(200);
  }
  Serial.println(F("CAN BUS Shield init ok!"));
  Serial.println("Time\t\tPGN\t\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7");
}


void loop()
{
  triggerHeartbeat();
  triggerReceive();
  readPins();
  //do other things non-blocking here:

}

void readPins()
// read GPIOs and trigger on change
{
  byte port = 0;
  for (byte j = 0; j < ANZAHL; j++) {
    port |= (!digitalRead(buttonPins[j]) << j);   // I use pullups so I invers the result
  }
  if (previousPort != port)
  {
    previousPort = port;
    triggerButton();
  }
}


uint32_t currentTxID(byte _priority)
// returns a txID with the given priority specific for this board
{
  /* 12345678901   basic format with 11 bits
     PPP           3 bit Priorität according emuration priority - maximal 8 priorities possible
        RR         2 bit reserve - could be used to extend the boards or priority later on
          UUUUUU   6 bit BOARD für a maximum of 64 Boards
  */
  return _priority << 8 | (USE_BOARD & 0b00111111);
}

void triggerHeartbeat()
// check, if it is time for a heartbeat and sends a hearbeat to the CAN Bus in minor priority
{
  if (millis() - sendPrevious >= sendInterval) {
    Serial.print(millis()); Serial.println(F("ms doSend"));
    txID = currentTxID(HEARTBEAT);
    stmp[0] = USE_BOARD;       // redundant just as a demo to send data
    stmp[1] = previousPort;    // some real payload - the status of the ports
    stmp[2] = sketchVersion;
    stmp[3] = random(0, 254);  // some changing value
    // send the data:  id = 0x00, Extended Frame, data len = 8, stmp: data buf
    // Extended Frame = 1: //CAN.sendMsgBuf(txID, 1, 8, stmp);
    CAN.sendMsgBuf(txID, 0, 8, stmp);
    sendPrevious = millis();
  }
}

void triggerButton()
// sends information about the button state to the CAN Bus
{
  Serial.print(millis()); Serial.println(F("ms triggerButton"));
  //should be fast therefore we only send a short message
  txID = currentTxID(BUTTON);
  stmp[0] = USE_BOARD;
  stmp[1] = previousPort;
  CAN.sendMsgBuf(txID, 0, 2, stmp);
  sendPrevious = millis();
}


void triggerReceive()
// simple print out of all messages on the CAN Bus
{
  if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
  {
    rcvTime = millis();
    CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
    rxId = CAN.getCanId();
    Serial.print(rcvTime);
    Serial.print("\t\t");
    Serial.print("0x");
    Serial.print(rxId, HEX);
    Serial.print("\t");
    for (int i = 0; i < len; i++) // print the data
    {
      if (buf[i] > 15) {
        Serial.print("0x");
        Serial.print(buf[i], HEX);
      }
      else {
        Serial.print("0x0");
        Serial.print(buf[i], HEX);
      }
      Serial.print("\t");
    }
    Serial.println();
  }
}


und hier der Monitor vom Board 1 (nach --> manuelle inline Kommentare)

Code: [Select]

1060221ms In doSend   --> Board 1 sendet einen Heartbeat
1060630..0x203.0x03.0x00.0x01.0x46.0xE9.0xFA.0xDD.0x51.  --> Board 3 sendet einen Heartbeat
1062041..0x204.0x04.0x00.0x01.0xC4.0xE9.0xFA.0xDD.0x51. --> Board 4 sendet einen Heartbeat
1063603..0x203.0x03.0x00.0x01.0xB1.0xE9.0xFA.0xDD.0x51. --> Board 3 sendet einen Heartbeat
1063707..0x4.0x04.0x04. --> auf Board 4 wurde ein Button 0x04 gedrückt
1063839..0x4.0x04.0x00. --> auf Board 4 wurden alle Buttons losgelassen
1064196..0x4.0x04.0x08. --> auf Board 4 wurde ein Button 0x08 gedrückt
1064302..0x4.0x04.0x00. --> auf Board 4 wurden alle Buttons losgelassen
1065222ms In doSend --> Board 1 sendet einen Heartbeat
1066576..0x203.0x03.0x00.0x01.0xB7.0xE9.0xFA.0xDD.0x51. --> Board 3 sendet einen Heartbeat


usw
DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

noiasca

P.S: der EEPROM Flasher macht nichts besonderes. Ich hänge ihn der Vollständigkeit an (smarthphone leser, da steht nichts besonderes drinnen).

DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

noiasca

Resümee des ganzen: Da steckt noch viel Arbeit drinnen, allein sich zu überlegen, was in den Messages gesandt wird, wie priorisiert man, wie vergibt man PGN. Und das war bisher nur die ganzen Slaves. Vom eigentlichen Master rede ich noch gar nicht.

Good Luck.
DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

mc-big-d

Danke ersteinmal für die Antworten.

Ich bin immer noch daran eine Liste mit den ganzen Infos übersichtlich zusammen zu fassen.


Da gibt es dann auch Prioritäten und alles was ich bis da dann zusammen tragen kann.

 
MfG

Go Up