Toetsenbord toetsen met Arduino Leonardo

Maak dan even een foto van dat printje, en zet het typenummer van die transistor erbij. Wat is de voedingsspanning van dat printje? 5V, 12V, 24V?

Je hebt de grounds wel verbonden, neem ik aan?

Je kunt niet zomaar je multimeter in een stroom-stand van een uitgang naar de ground zetten, daarmee sluit je die uitgang kort, en gaan er dingen stuk.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

De voedingsspanning van het printje is 24V. Grounds zijn inderdaad hetzelfde. Ik ben nog wat aan het meten geweest en meet die 24V ook op die schakeldraad dus ik vermoed dat het daar fout gaat. Deze zal ook naar 5V moeten of gescheiden worden in de schakeling??

Lambiek

Special Member

Op 8 januari 2021 22:27:48 schreef SparkyGSX:
Je kunt niet zomaar je multimeter in een stroom-stand van een uitgang naar de ground zetten, daarmee sluit je die uitgang kort, en gaan er dingen stuk.

Hij heeft niet over de uitgang gemeten maar tussen de pin die je naar de gnd moet trekken en de gnd van het relais bord. Niets mis mee dus.

Als je haar maar goed zit, GROETEN LAMBIEK.

Nee, als je die naar 5V trekt (arduino pin hoog of open) loopt er ook stroom dus zal de transistor in geleiding gaan. Je kunt dat oplossen met een extra transistor, of een ander relaisboard gebruiken.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Dat heb ik hem ook al verteld.

Als je haar maar goed zit, GROETEN LAMBIEK.

Eh waar dan, in dit topic? Ik zie het niet...

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Via de app, hij heeft met jou toch ook contact via de mail. Niets mis mee lijkt mij. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik denk dat het mijn fout is geweest dat ik niet gekeken had wat het voltage was tijdens het sinken. Door mijn gebrek aan de juiste kennis ging ik er vanuit dat dit niet belangrijk was. Ik dacht dat ik het als een soort klep kon zien maar dat is blijkbaar niet zo 8)7
Nu zit er een uln2803 tussen en werkt het goed!
Beide bedankt zover!

Lambiek

Special Member

Op 9 januari 2021 12:53:50 schreef BartL:
Nu zit er een uln2803 tussen en werkt het goed!

Het komt ook door het soort relais board, dat ding is heel anders opgebouwd dan zo'n board voor een Arduino. Het is waarschijnlijk een board voor industriële doeleinden, dus dat ding hebben ze veel minder gevoelig gemaakt. Maar het werkt nu en je kunt dus weer verder met je project. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 9 januari 2021 11:18:48 schreef Lambiek:
Via de app, hij heeft met jou toch ook contact via de mail. Niets mis mee lijkt mij. :)

Ah vandaar, ik dacht al dat ik gek was (niet op antwoorden).

Juist hierom vind ik mail en app contact buiten het forum een beetje onhandig.

Ik vind het wel een beetje raar dat ze zo'n relaisboard met darlingtons high-side schakelen met 24V, actief-lage logica vind je bijna niet in de industrie, in mijn ervaring.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op 9 januari 2021 14:21:48 schreef SparkyGSX:
Ah vandaar, ik dacht al dat ik gek was (niet op antwoorden).

Haha. Nee je bent niet gek, in tegendeel. :)

Juist hierom vind ik mail en app contact buiten het forum een beetje onhandig.

Ja dat is ook zo, is een beetje verwarrend.

Ik vind het wel een beetje raar dat ze zo'n relaisboard met darlingtons high-side schakelen met 24V, actief-lage logica vind je via niet in de industrie, in mijn ervaring.

Ja dat vind ik ook, meestal wordt zo'n ding toch via een plc of wat ook aangestuurd. Of het moet voor een speciaal iets ontworpen zijn dat weet ik ook niet.

Als je haar maar goed zit, GROETEN LAMBIEK.

Nog even een vraagje mbt de keyboard input van de Arduino.
Ik wil hier nog een knop aanhangen die bij de eerste keer indrukken Ctrl+D als output geeft en bij de volgende keer Ctrl+Shift+D, daarna weer Ctrl+D...etc.
Kan iemand hier een voorzetje geven hoe ik dit in de code aangeef?

Alvast dank!

Als je de info uit deze link <https://arduinogetstarted.com/tutorials/arduino-button-toggle-led> gebruikt in jouw bestaande code ben je goed weg op.
Toggle button, dus telkens je drukt verandert de State, wanneer je nu de ene state gelijk steld aan <CTRL+D> en de andere state aan <SHIFT+CTRL+D> is je wens vervuld.

Op 12 januari 2021 18:04:34 schreef Gij Kieken:
Als je de info uit deze link <https://arduinogetstarted.com/tutorials/arduino-button-toggle-led> gebruikt in jouw bestaande code ben je goed weg op.
Toggle button, dus telkens je drukt verandert de State, wanneer je nu de ene state gelijk steld aan <CTRL+D> en de andere state aan <SHIFT+CTRL+D> is je wens vervuld.

Die had ik inderdaad ook gevonden, echter werkt hij niet goed dus doe ik iets fout.
De eerste keer indrukken werkt goed maar bij de tweede keer indrukken lijkt hij het een fractie van een seconde goed te doen maar reageert hij alsof ik hem daarna gelijk weer indruk.
Dit is (een deel van) wat ik nu heb:


  CWLastButtonState = CWButtonState;
  CWButtonState = digitalRead(tool_cw);
    if (CWLastButtonState == LOW && CWButtonState == LOW)   {
    Keyboard.press(0x80);
    Keyboard.press('d');
    delay(100);
    Keyboard.releaseAll();
  }  
    if (CWLastButtonState == HIGH && CWButtonState == LOW)   {
    Keyboard.press(0x80);
    Keyboard.press(0x81);
    Keyboard.press('d');
    delay(100);
    Keyboard.releaseAll();
  }  

Heb het een beetje aangepast ,verander naar wens.
Ik weet niet op welke ingang het aangesloten is en of Pull-Up of Pull-Down gebruikt.
Kan het ook niet testen want heb niet zo een bordje.


#include "Keyboard.h"

/*
  Debounce
  Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
  press), a variable is toggled from LOW to HIGH or HIGH to LOW. There's a
  minimum delay between toggles to debounce the circuit (i.e. to ignore noise).

  The circuit:
  - pushbutton attached from pin 2 to gnd
*/
Serial.begin & Serial.println kun jij gerust weglaten ,was een geheugensteuntje voor mij.
// constants won't change. They're used here to set pin numbers:
const uint8_t tool_cw = 2;    // the number of the pushbutton pin

// Variables will change:
uint8_t keyState = HIGH;           // the current state of the key's to send
uint8_t CwButtonState;             // the current reading from the input pin
uint8_t CwLastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  Serial.begin(9600);
  pinMode(tool_cw, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  // read the state of the switch into a local variable:
  uint8_t reading = digitalRead(tool_cw);

  // check to see if you just pressed the button
  // (i.e. the input went from HIGH to LOW), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != CwLastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != CwButtonState) {
      CwButtonState = reading;

      // only toggle the LED if the new button state is LOW
      if (CwButtonState == LOW) {
        keyState = !keyState;
        if (keyState) {
          Keyboard.press(0x80);
          Keyboard.press('d');
          delay(100);
          Keyboard.releaseAll();
          Serial.println("<CTRL+D>");
        } else {
          Keyboard.press(0x80);
          Keyboard.press(0x81);
          Keyboard.press('d');
          delay(100);
          Keyboard.releaseAll();
          Serial.println("<SHIFT+CTRL+D>");
        }
      }
    }
  }
  // save the reading. Next time through the loop, it'll be the lastButtonState:
  CwLastButtonState = reading;
}

Helaas, er gebeurt nu niets als ik op de seriele monitor kijk.

Voor de zekerheid even de hele code bijgevoegd, misschien staat er nog iets geks in.


#include <Keyboard.h>

int arrowLeft = 2;
int arrowRight = 3;
int arrowUp = 4;
int arrowDn = 5;
int pgUp = 6;
int pgDn = 7;
int ctrl = 8;
int shift = 9;
int f2 = 10;
int f5 = 11;
int f6 = 12;
int f7 = 13;
int Home = A5;
int End = A4;
const uint8_t tool_cw = A3;

uint8_t keyState = HIGH;           // the current state of the key's to send
uint8_t CwButtonState;             // the current reading from the input pin
uint8_t CwLastButtonState = LOW;   // the previous reading from the input pin

unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  Serial.begin(9600);
  pinMode( arrowLeft, INPUT_PULLUP);
  pinMode( arrowRight, INPUT_PULLUP);
  pinMode( arrowUp, INPUT_PULLUP);
  pinMode( arrowDn, INPUT_PULLUP);
  pinMode( pgUp, INPUT_PULLUP);
  pinMode( pgDn, INPUT_PULLUP);
  pinMode( ctrl, INPUT_PULLUP);
  pinMode( shift, INPUT_PULLUP);
  pinMode( f2, INPUT_PULLUP);
  pinMode( f5, INPUT_PULLUP);
  pinMode( f6, INPUT_PULLUP);
  pinMode( f7, INPUT_PULLUP);
  pinMode( Home, INPUT_PULLUP);
  pinMode( End, INPUT_PULLUP);
  pinMode( tool_cw, INPUT_PULLUP);

  Keyboard.begin();
}

void loop() {

  if (digitalRead(arrowLeft) == LOW) {
    //Send the message
    Keyboard.write(0xD8);
  }
  if (digitalRead(arrowRight) == LOW) {
    //Send the message
    Keyboard.write(0xD7);
  }
    if (digitalRead(arrowUp) == LOW) {
    //Send the message
    Keyboard.write(0xDA);
  }
    if (digitalRead(arrowDn) == LOW) {
    //Send the message
    Keyboard.write(0xD9);
  }
    if (digitalRead(pgUp) == LOW) {
    //Send the message
    Keyboard.write(0xD3);
  }
    if (digitalRead(pgDn) == LOW) {
    //Send the message
    Keyboard.write(0xD6);
  }
    if (digitalRead(ctrl) == LOW) {
    //Send the message
    Keyboard.write(0x80);
  }
    if (digitalRead(shift) == LOW) {
    //Send the message
    Keyboard.write(0x81);
  }
    if (digitalRead(f2) == LOW) {
    //Send the message
    Keyboard.write(0xC3);
  }
    if (digitalRead(f5) == LOW) {
    //Send the message
    Keyboard.write(0xC6);
  }
    if (digitalRead(f6) == LOW) {
    //Send the message
    Keyboard.write(0xC7);
  }
    if (digitalRead(f7) == LOW) {
    //Send the message
    Keyboard.write(0xC8);
  }
    if (digitalRead(Home) == LOW) {
    //Send the message
    Keyboard.write(0xD2);
  }
    if (digitalRead(End) == LOW) {
    //Send the message
    Keyboard.write(0xD5);
  }  

  uint8_t reading = digitalRead(tool_cw);
 if (reading != CwLastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != CwButtonState) {
      CwButtonState = reading;

      // only toggle the LED if the new button state is LOW
      if (CwButtonState == LOW) {
        keyState = !keyState;
        if (keyState) {
          Keyboard.press(0x80);
          Keyboard.press('d');
          delay(100);
          Keyboard.releaseAll();
          Serial.println("<CTRL+D>");
        } else {
          Keyboard.press(0x80);
          Keyboard.press(0x81);
          Keyboard.press('d');
          delay(100);
          Keyboard.releaseAll();
          Serial.println("<SHIFT+CTRL+D");
        }
      }
    }
  }
}

Ik heb helaas geen ervaring met een Leonardo bij gebrek aan dergelijk bordje.
Maar weet wel dat het soms vervelende dingen zijn met hier en daar een Bug in.
Waar je zeker moet op letten is dat je de juist com poort instelt want ik geloof dat er twee kunnen verschijnen in win config apparaat beheer.
Zo kan het gebeuren dat je sketch moet uploaden met de ene port instelling en je serail monitor op de andere moet zetten om de serial prints te kunnen zien.

Nee dat zal het niet zijn. Wanneer ik een print doe van arrowleft bijvoorbeeld krijg ik dat keuring in beeld wanneer ik de knop indruk. De verbinding met de arduino is dus prima.

Wat als je enkel het stukje code wat ik doorgestuurd upload?
Wat werkt er dan en wat niet?
Hou rekening met de juiste i/o port.

Hij werkt inmiddels. Ik had de codes nog eens naast elkaar gelegd en kwam erachter dat ik de onderste regel vergeten was. 8)7

Dan had ik nog een "programmeer" vraagje.
In een eerdere code waar Sparky mij mee heeft geholpen stond een line als:
digitalWrite( X, digitalRead( Y ) ); waarbij -als ik het goed begrijp- de output X in dezelfde state wordt gebracht als de input Y, dus HIGH=HIGH en LOW=LOW. Dit is een aanzienlijk kortere notering dan If...else.

Echter nu dacht ik dat ook in de keyboard file te doen voor de simpele knoppen maar dit werkt dan weer niet.
Ik dacht dus bijvoorbeeld deze notering:


  if (digitalRead(arrowLeft) == LOW) {
    Keyboard.write(0xD8);
  }

Als dit op te schrijven:


    Keyboard.write( 0xD8, ! digitalRead( arrowLeft ) );

Kan iemand mij uitleggen waarom dit dan niet werkt?

Keyboard.write() verwacht maar een parameter. Dus bij 2 parameters krijg je compiler fouten.

Tenzij je een nieuwe Keyboard.write() funktie aanmaakt die een tweede parameter gebruikt om te testen of het bericht verstuurd moet worden.

Bijv :


void SendKeyCode(uint8_t KeyCode, int PinValue)
{  if(PinValue == LOW)
   {  Keyboard.write(KeyCode); 
   }
}

En dan in loop:


   SendKeyCode(0xD8, digitalRead(arrowleft));

Duidelijk, in dat geval kan ik hem beter laten staan zoals hij stond om het overzichtelijk te houden.

Beste specialisten,

Ik heb bovenstaande nu (eindelijk) in gebruik maar loop nu tegen iets aan wat ik nog niet opgelost krijg.
De Arduino drukt nu weleens knoppen in die in werkelijkheid niet ingedrukt worden.
Nu is hier de debounce functie voor maar ik weet niet goed hoe ik die toe moet passen op een hele reeks knoppen. Eigenlijk wil ik dit gewoon toepassen op iedere knop. Wie kan mij helpen dit op de simpelste manier te doen?
Alvast bedankt!

Voor de volledigheid, bij deze de huidige code.


#include <Keyboard.h>

int X_min = 0;
int X_plus = 1;
int Y_plus = 2;
int Y_min = 3;
int Z_plus = 4;
int Z_min = 5;
int A_plus = 6;
int A_min = 7;
int ctrl = 8;
int shift = 9;
int Jog_cont = 10;
int Jog_001 = 11;
int Jog_01 = 12;
int Jog_1 = 13;
int Home = A2;
int Reset = A3;
int Main_Auto = A4;
int Mdi = A5;

uint8_t CwKeyState = HIGH;           // the current state of the key's to send
uint8_t CwButtonState;             // the current reading from the input pin
uint8_t CwLastButtonState = LOW;   // the previous reading from the input pin

unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  Serial.begin(9600);
  pinMode( X_min, INPUT_PULLUP);
  pinMode( X_plus, INPUT_PULLUP);
  pinMode( Y_plus, INPUT_PULLUP);
  pinMode( Y_min, INPUT_PULLUP);
  pinMode( Z_plus, INPUT_PULLUP);
  pinMode( Z_min, INPUT_PULLUP);
  pinMode( A_plus, INPUT_PULLUP);
  pinMode( A_min, INPUT_PULLUP);
  pinMode( ctrl, INPUT_PULLUP);
  pinMode( shift, INPUT_PULLUP);
  pinMode( Jog_cont, INPUT_PULLUP);
  pinMode( Jog_001, INPUT_PULLUP);
  pinMode( Jog_01, INPUT_PULLUP);
  pinMode( Jog_1, INPUT_PULLUP);
  pinMode( Home, INPUT_PULLUP);
  pinMode( Reset, INPUT_PULLUP);
  pinMode( Main_Auto, INPUT_PULLUP);
  pinMode( Mdi, INPUT_PULLUP);

  Keyboard.begin();
}

void loop() {
  // next commands are controlled by the JOG joysticks.

  //Arrow Left.
  if (digitalRead(X_min) == LOW) {
    Keyboard.press(0xD8);
  }
  if (digitalRead(X_min) == HIGH) {
    Keyboard.release(0xD8);
  }
  //Arrow Right.
  if (digitalRead(X_plus) == LOW) {
    Keyboard.press(0xD7);
  }
  if (digitalRead(X_plus) == HIGH) {
    Keyboard.release(0xD7);
  }
  //Arrow Up.
  if (digitalRead(Y_plus) == LOW) {
    Keyboard.press(0xDA);
  }
  if (digitalRead(Y_plus) == HIGH) {
    Keyboard.release(0xDA);
  }
  //Arrow Down.
  if (digitalRead(Y_min) == LOW) {
    Keyboard.press(0xD9);
  }
  if (digitalRead(Y_min) == HIGH) {
    Keyboard.release(0xD9);
  }
  // Page Up.
  if (digitalRead(Z_plus) == LOW) {
    Keyboard.press(0xD3);
  }
  if (digitalRead(Z_plus) == HIGH) {
    Keyboard.release(0xD3);
  }
  // Page Down.
  if (digitalRead(Z_min) == LOW) {
    Keyboard.press(0xD6);
  }
  if (digitalRead(Z_min) == HIGH) {
    Keyboard.release(0xD6);
  }
  //Home.
  if (digitalRead(A_plus) == LOW) {
    Keyboard.press(0xD2);
  }
  if (digitalRead(A_plus) == HIGH) {
    Keyboard.release(0xD2);
  }
  //End.
  if (digitalRead(A_min) == LOW) {
    Keyboard.press(0xD5);
  }
  if (digitalRead(A_min) == HIGH) {
    Keyboard.release(0xD5);
  }

  // Next commands define the JOG steps.
  //Ctrl+Shift+N
  if (digitalRead(Jog_cont) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press(0x81);
    Keyboard.press('N');
    delay(100);
    Keyboard.releaseAll();
  }
  //Ctrl+Alt+Shift+R
  if (digitalRead(Jog_001) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press(0x82);
    Keyboard.press(0x81);
    Keyboard.press('R');
    delay(100);
    Keyboard.releaseAll();
  }
  //Ctrl+Alt+Shift+S
  if (digitalRead(Jog_01) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press(0x82);
    Keyboard.press(0x81);
    Keyboard.press('S');
    delay(100);
    Keyboard.releaseAll();
  }
  //Ctrl+Alt+Shift+T
  if (digitalRead(Jog_1) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press(0x82);
    Keyboard.press(0x81);
    Keyboard.press('T');
    delay(100);
    Keyboard.releaseAll();
  }

  // Next commands are used by the JOG speed switch.
  //Ctrl
  if (digitalRead(ctrl) == LOW) {
    Keyboard.press(0x80);
  }
  if (digitalRead(ctrl) == HIGH) {
    Keyboard.release(0x80);
  }
  //Shift
  if (digitalRead(shift) == LOW) {
    Keyboard.press(0x81);
  }
  if (digitalRead(shift) == HIGH) {
    Keyboard.release(0x81);
  }


  // Next command is used next to home all axis'.
  //Ctrl+H
  if (digitalRead(Home) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press('h');
    delay(100);
    Keyboard.releaseAll();
  }
  // Next commands are used next to the screen'.
  //Ctrl+R
  if (digitalRead(Reset) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press('r');
    delay(100);
    Keyboard.releaseAll();
  }
  //Toggle between Main and Auto menu.
  uint8_t reading = digitalRead(Main_Auto);
  if (reading != CwLastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != CwButtonState) {
      CwButtonState = reading;

      if (CwButtonState == LOW) {
        CwKeyState = !CwKeyState;
        if (CwKeyState) {
          // Alt+F1
          Keyboard.press(0x82);
          Keyboard.press(0xC2);
          delay(100);
          Keyboard.releaseAll();
        } else {
          // Alt+F4
          Keyboard.press(0x82);
          Keyboard.press(0xC5);
          delay(100);
          Keyboard.releaseAll();
        }
      }
    }
  }
  CwLastButtonState = reading;

  //Ctrl+F6
  if (digitalRead(Mdi) == LOW) {
    Keyboard.press(0x80);
    Keyboard.press(0xC7);
    delay(100);
    Keyboard.releaseAll();
  }
}